我需要压缩每个文本文件并复制到另一台服务器。文件大小可能从 500MB 到 8GB。每个文件都没有依赖关系。我有 35 个文件
我的常规代码为此花费了大约 3-4 小时。为了减少时间,我只是想为此实现线程。你觉得线程会减少时间还是有其他最好的方法来做到这一点。
我需要压缩每个文本文件并复制到另一台服务器。文件大小可能从 500MB 到 8GB。每个文件都没有依赖关系。我有 35 个文件
我的常规代码为此花费了大约 3-4 小时。为了减少时间,我只是想为此实现线程。你觉得线程会减少时间还是有其他最好的方法来做到这一点。
.Net 4.0 有一个新的 Threading.Task 命名空间,这使得调度任务变得更加容易,而无需深入了解线程调度。
它允许您在前一个任务完成后将后续任务排队运行(无论成功或失败)。
http://msdn.microsoft.com/en-us/library/system.threading.tasks.aspx
http://www.codethinked.com/net-40-and-systemthreadingtasks
但是,正如之前的评论者所建议的那样,如果瓶颈不是 CPU 进行文件压缩,而是网络传输,那么它可能无济于事。
根据我处理大文件的经验,由于硬盘读/写本身和/或网络的限制,多线程不会加快处理速度。
您不仅要对硬盘进行大量读写操作,还要通过网络将大文件复制到另一台计算机。
如果您的平均文件大小为 4.25 GB,那么我们正在处理的存储空间为 148.75 GB(按 35 个文件计数)。这是一个很大的空间,你不仅要将所有空间读入内存(希望不是一次全部,否则虚拟内存将开始启动,它会向你的硬盘写入更多内容),你还写了一些该空间以 zip 文件的形式返回。
将该因素添加到通过网络传输文件时,如果您的网络是我必须处理的典型网络,我一点也不感到惊讶。兆位和千兆位的速度从来都不是他们声称的那样。
我建议您使用Task.Factory.StartNew
它,因为它默认为每个内核创建 1 个线程并排队另一个线程。
如果您使用外部实用程序进行压缩(即 7-zip),并且进程启动不是您的应用程序的问题,我会保持简单,只需 Process.Start() 尽可能多的 7-zip EXE (准)并行执行任务,或者一次执行一些任务,例如 5 个。由您决定。