windows机器上存储了大概2亿张小图片,每张170字节。
怎么才能高效的转移这批图片呢?
试过打压缩包,一次打包2000万张图要花5天,如果打包全部图片会直接报错内存不足。
也试着用java读取后图片转成base64,做成大文件再拷贝,但是每次都是大概前3w张图速度很快,1000张图只用100ms不到,3万张图之后任务管理里的磁盘io直接100%,效率直线下降,每1000张图要差不多10秒以上。
大神们有没有什么好办法?求赐教
把你code贴出来
直接把硬盘拆了
3万张图之后任务管理里的磁盘io直接100%,效率直线下降
那就先每2W图片生成一个文件,然后再把生成的文件合并,一步一步的减少文件数量;
再结合使用下多线程
多线程处理,才可以合理利用磁盘IO。度娘搜下多线程copy
任何系统也不可能同时无限制打开文件,一个线程在阻塞环境下也只能做一件事,那就是要根据线程的数量做好规划,你需要有一个专门的线程去获取目录下的文件句柄(不读文件),然后将句柄丢给专门的读取文件的线程,读取文件的线程将内容读取到后给传输线程,传输线程与目标服务器保持连接,收到文件就将信息传输过去。比如你有四核8线程服务器,线程0留给系统,1读目录,234获取文件内容,567负责发送。向你一个for循环套for循环再套for循环,文件句柄就把资源耗光了。
曾经这样把一台满满的服务器大图转小图又续命几年。
这种暴力密集CPU和磁盘操作,多线程可能收益有限。关键是循环列表不要太大。
你如果用文件在这种目录下持续list,还for几下,可能会产生一个几亿的平方立方n次方次导致卡顿,建议:
1. 先建立一个多层次的树形分类规则,例如根据日期分年月日多层,把线性一维海量数据变成树,把每次处理几亿和重复处理,变成每次处理一个小型目录里有限集合。
2. 先写个程序把pic目录下图片每次读到一个就移动到映射的对应目录下去,这样你程序即便运行几万挂了,也是处理了几万张,下次继续处理也会越来越少。
3. 写个对单一目录操作函数, 合并大图,入数据库,转小图,高斯模糊还是进图片搜索索引什么的看自己需求。
4. 写个递归目录操作函数,把3用上,过程写日志,随时把握总体进度情况。
把你code贴出来
怎么才能高效的转移这批图片呢?
直接把硬盘拆了
3万张图之后任务管理里的磁盘io直接100%,效率直线下降
那就先每2W图片生成一个文件,然后再把生成的文件合并,一步一步的减少文件数量;
再结合使用下多线程
多线程处理,才可以合理利用磁盘IO。度娘搜下多线程copy
任何系统也不可能同时无限制打开文件,一个线程在阻塞环境下也只能做一件事,那就是要根据线程的数量做好规划,你需要有一个专门的线程去获取目录下的文件句柄(不读文件),然后将句柄丢给专门的读取文件的线程,读取文件的线程将内容读取到后给传输线程,传输线程与目标服务器保持连接,收到文件就将信息传输过去。比如你有四核8线程服务器,线程0留给系统,1读目录,234获取文件内容,567负责发送。向你一个for循环套for循环再套for循环,文件句柄就把资源耗光了。
曾经这样把一台满满的服务器大图转小图又续命几年。
这种暴力密集CPU和磁盘操作,多线程可能收益有限。关键是循环列表不要太大。
你如果用文件在这种目录下持续list,还for几下,可能会产生一个几亿的平方立方n次方次导致卡顿,建议:
1. 先建立一个多层次的树形分类规则,例如根据日期分年月日多层,把线性一维海量数据变成树,把每次处理几亿和重复处理,变成每次处理一个小型目录里有限集合。
2. 先写个程序把pic目录下图片每次读到一个就移动到映射的对应目录下去,这样你程序即便运行几万挂了,也是处理了几万张,下次继续处理也会越来越少。
3. 写个对单一目录操作函数, 合并大图,入数据库,转小图,高斯模糊还是进图片搜索索引什么的看自己需求。
4. 写个递归目录操作函数,把3用上,过程写日志,随时把握总体进度情况。