首页 新闻 会员 周边 捐助

多线程拷贝文件,文件数量5T,该怎么解决?

0
悬赏园豆:10 [已解决问题] 解决于 2017-01-10 09:47

如题,今天试了Parallel的多线程来拷贝文件。核心代码是File.Copy; 大概准备了18000个文件尝试了下拷贝。但貌似很容易 电脑就卡住了,Windows资源管理器失去响应。

想问下,多线程在文件拷贝中 有意义吗?或者有好的解决方法吗?

王庆东mas的主页 王庆东mas | 初学一级 | 园豆:4
提问于:2017-01-09 15:55
< >
分享
最佳答案
1

高负荷的io操作一般而言多用线程是有好处,但你这里碰到了磁盘最大读写速度的瓶颈,所以在这种场景下过多的线程反而没太大意义。如果你的文件有5TB(求种子~~~),那么硬盘一般而言就不是普通的了,可能是企业级用的,这种你最好多试几次判断下极限在哪。但一般情况下而言,18000个文件共5TB,你一个线程跑也慢不到哪去。

收获园豆:10
Daniel Cai | 专家六级 |园豆:10424 | 2017-01-10 09:29

 谢谢啦!18000和5TB虚构的。 有几个问题不吝赐教:

1、怎么科学合理的“试几次判断下极限在哪”

2、8TB SSD固态硬盘,多线程向同硬盘拷贝,瓶颈应该不容易达到吧?

王庆东mas | 园豆:4 (初学一级) | 2017-01-10 09:34

@王庆东mas: 这个和你ssd的性能以及你是否做了4k对齐有关。你先用ssd benchmark测下读写性能。8tb的ssd这个应该不是家用的了,性能应该在400M/s以上吧(顺序读)。

这个极限和传统的hdd还不同,那个还有寻道时间,ssd这块基本就忽略吧(相差一般在百倍),而且你又是大文件(建立在你18000和5tb的基础上,如果条件不同可能差异会很大),单线程可能就基本把io给打满(具体可以通过性能管理器或者任务管理器中看),如果还有余量的话你就可以增加线程来看极限在哪。

另ssd也不是完全没有瓶颈的,我公司有专门的文件服务器,用ssd卡(企业级),在高负荷的时候也经常打满。

Daniel Cai | 园豆:10424 (专家六级) | 2017-01-10 09:43

@Daniel Cai: 谢谢

王庆东mas | 园豆:4 (初学一级) | 2017-01-10 09:46
其他回答(5)
2

多线程文件没有意思。在一块硬盘上的时候。单线程文件顺序写才是最快的。还有如果你的磁盘打满了(不管你时什么方式的读写)。系统一样慢。

czd890 | 园豆:14488 (专家六级) | 2017-01-09 16:08

 打满是啥意思? 转速很小的情况下吗?

支持(0) 反对(0) 王庆东mas | 园豆:4 (初学一级) | 2017-01-09 17:00
0

多线程读,是读得快,但是你硬盘的速度跟不上有啥用呢?而且内存很容易就满了,电脑就卡了呗。

让我发会呆 | 园豆:2929 (老鸟四级) | 2017-01-09 16:14

能说专业点吗?谢谢了

支持(0) 反对(0) 王庆东mas | 园豆:4 (初学一级) | 2017-01-09 16:21

@王庆东mas: 来自百度

多线程就是多个指令序列同时执行,能同时占有多个CPU核心,提高整体运算速度。
不过不建议用多线程复制,多个线程同时访问同一个物理设备,同时只有一个线程能获得这个设备的控制权,其他线程都在等待。因此文件复制的瓶颈在disk i/o,不在CPU,多线程不能提高disk i/o的性能,反而有可能增加磁盘的寻道时间。

支持(1) 反对(0) 让我发会呆 | 园豆:2929 (老鸟四级) | 2017-01-09 16:27
1

怎么会没有意义呢,如果你的电脑挂了3000多个硬盘,那么多线程COPY还是有意义的。

不同的线程复制不同的硬盘,一个CPU对付一千个硬盘。

爱编程的大叔 | 园豆:30844 (高人七级) | 2017-01-09 16:42

 但如果是D盘:folder1目录下8T 个文件 复制到D盘:folder2目录下呢?这样多线程怎么派上用场呢? 谢谢

支持(0) 反对(0) 王庆东mas | 园豆:4 (初学一级) | 2017-01-09 16:59

@王庆东mas: 所以大家说了这么多,你还是没明白多线程是干啥的?

 

请问一个女人生一个孩子十个月,十个女人生十一个孩子需要几个月?

(排除多胞胎情况)

 


最后上一张谷歌大神的图:

支持(1) 反对(0) 爱编程的大叔 | 园豆:30844 (高人七级) | 2017-01-09 18:44

@爱编程的大叔: 谢谢

支持(0) 反对(0) 王庆东mas | 园豆:4 (初学一级) | 2017-01-10 09:26
1

将数据转成2进制,用单线程控制

小粽子饱饱 | 园豆:251 (菜鸟二级) | 2017-01-09 16:49
1

说明你的操作系统线程已经可能不堪重负,线程越多不一定越快(何况乎硬盘)。

实际优化要根据你的实际情况,硬盘文件的情况,大文件还是小文件,单硬盘还是多硬盘。单硬盘的话哪怕cpu再强——线程开再多也没用(即使ssd跟内存速度也不再一个数量级),因为硬盘本身的寻址就是瓶颈。速度取决于最短板的硬件——所谓水桶就这样。

花飘水流兮 | 园豆:13615 (专家六级) | 2017-01-09 23:53

谢谢!小文件和大文件 可以解释吗?

支持(0) 反对(0) 王庆东mas | 园豆:4 (初学一级) | 2017-01-10 09:27
清除回答草稿
   您需要登录以后才能回答,未注册用户请先注册