最近做的一个接口,需要从一个FTP目录下载大量图片数据,某某原因就不说了,反正就是根目录下直接来106万张图片,大概每张250k左右,windows资源管理器访问FTP时都打不开。 m_ftp_connect->GetCurrentDirectory(cur_path); m_log->WriteLog(kLogInfo,"开始遍历源FTP目录:%s", cur_path.GetBuffer()); DWORD beginTm = ::GetTickCount(); CFtpFileFind finder(m_ftp_connect); BOOL bWorking=finder.FindFile("*.*"); while (bWorking) { bWorking = finder.FindNextFile(); DWORD endTm = ::GetTickCount() - beginTm; if (finder.IsDots() ) continue; //........ } 定位后发现卡在FindFile()这个位置不动。 自己在本地模拟环境时尝试了在根目录下放了约12W图片,27G,得到的endTm值大概在17000~24000之间。这意味着在现场环境下这种遍历方式会卡在这里更长时间。 |
|
20分 |
system(“dir /b /a-d c:\*.* >d:\allfiles.txt”);
//读文件d:\allfiles.txt的内容即C:\下所有文件的名字 system(“dir /b /a-d /s c:\*.* >d:\allfilesinsub.txt”); //读文件d:\allfilesinsub.txt的内容即C:\下所有文件的名字包含子目录 system(“dir /b /ad c:\*.* >d:\alldirs.txt”); //读文件d:\alldirs.txt的内容即C:\下所有子目录的名字 请记住,能用shell命令获取文件、文件夹信息或者操作文件、文件夹最好用shell命令获取或者操作,而不要用各种API获取或者操作,因为当遇到非法文件夹名或非法文件名或非法文件长度、非法文件日期、压缩文件、链接文件、稀疏文件……等各种意料之外的情况时,API会处理的不全面或陷入死循环,而shell命令不会。 |
赵老师好~多谢指点。 这样比较麻烦的是没办法直接去处理~ |
|
处理十万级以上的任何对象,最好都借助本地临时文件;不然的话,光内存紧张、流程中断重启后继续、断点续传、……等问题就够你喝好几壶了!
|
|
如果你觉得用临时文件效率偏低,请参考:
无profiler不要谈效率!尤其在这个云计算、虚拟机、模拟器、CUDA、多核 、多级cache、指令流水线、多种存储介质、……满天飞的时代! |
|
不好意思点错了 |