+
 新版

批量读取小文件问题

coderLuo 发布于 2021/01/01 21:57
阅读 535
收藏 0

windows机器上存储了大概2亿张小图片,每张170字节。

怎么才能高效的转移这批图片呢?

试过打压缩包,一次打包2000万张图要花5天,如果打包全部图片会直接报错内存不足。

也试着用java读取后图片转成base64,做成大文件再拷贝,但是每次都是大概前3w张图速度很快,1000张图只用100ms不到,3万张图之后任务管理里的磁盘io直接100%,效率直线下降,每1000张图要差不多10秒以上。

大神们有没有什么好办法?求赐教

加载中
0
linxyz
linxyz

把你code贴出来

coderLuo
coderLuo
大佬,有这种经验吗?
0
开源中国合格公民
开源中国合格公民

怎么才能高效的转移这批图片呢?

直接把硬盘拆了

0
开源中国合格公民
开源中国合格公民

3万张图之后任务管理里的磁盘io直接100%,效率直线下降

那就先每2W图片生成一个文件,然后再把生成的文件合并,一步一步的减少文件数量;

再结合使用下多线程

coderLuo
coderLuo
不是合并的文件过大导致的,我把后续处理的代码全到注释了,现在仅仅是读取,当读取到3万左右的时候就开始卡了,和是否生成文件没关系。怀疑是不是java没有释放干净导致的
0
fancanjie
fancanjie

多线程处理,才可以合理利用磁盘IO。度娘搜下多线程copy

0
自由PHP
自由PHP

任何系统也不可能同时无限制打开文件,一个线程在阻塞环境下也只能做一件事,那就是要根据线程的数量做好规划,你需要有一个专门的线程去获取目录下的文件句柄(不读文件),然后将句柄丢给专门的读取文件的线程,读取文件的线程将内容读取到后给传输线程,传输线程与目标服务器保持连接,收到文件就将信息传输过去。比如你有四核8线程服务器,线程0留给系统,1读目录,234获取文件内容,567负责发送。向你一个for循环套for循环再套for循环,文件句柄就把资源耗光了。

0
梅开源
梅开源

曾经这样把一台满满的服务器大图转小图又续命几年。

这种暴力密集CPU和磁盘操作,多线程可能收益有限。关键是循环列表不要太大。

你如果用文件在这种目录下持续list,还for几下,可能会产生一个几亿的平方立方n次方次导致卡顿,建议:

1. 先建立一个多层次的树形分类规则,例如根据日期分年月日多层,把线性一维海量数据变成树,把每次处理几亿和重复处理,变成每次处理一个小型目录里有限集合。

2. 先写个程序把pic目录下图片每次读到一个就移动到映射的对应目录下去,这样你程序即便运行几万挂了,也是处理了几万张,下次继续处理也会越来越少。

3. 写个对单一目录操作函数, 合并大图,入数据库,转小图,高斯模糊还是进图片搜索索引什么的看自己需求。

4. 写个递归目录操作函数,把3用上,过程写日志,随时把握总体进度情况。

 

 

 

OSCHINA
登录后可查看更多优质内容
返回顶部
顶部