【问题标题】:multithreading for file load in C# 4.0 [closed]C# 4.0中文件加载的多线程[关闭]
【发布时间】:2012-10-01 18:48:14
【问题描述】:

我需要压缩每个文本文件并复制到另一台服务器。文件大小可能从 500MB 到 8GB。每个文件都没有依赖关系。我有 35 个文件 Appx。

我的常规代码为此花费了大约 3-4 小时。为了减少时间,我只是想为此实现线程。你觉得线程会减少时间还是有其他最好的方法来做到这一点。

【问题讨论】:

  • 首先看看是不是因为你必须压缩文件并且它正在使用 100% 的一个内核,或者是因为通过网络复制速度很慢。
  • File size may very from 500MB to 8GB - ZIP 文件不能大于 4GB。你希望如何压缩一个 8GB 的​​文件?
  • @Darin Dimitrov 压缩文件的最小大小为 22 字节。对于标准 ZIP,存档文件和其中的单个文件的最大大小为 4,294,967,295 字节(232-1 字节,或 4 GiB),对于 ZIP64,为 18,446,744,073,709,551,615 字节(264-1 字节,或 16 EiB)
  • 几乎不可能“按原样”回答这个问题,因为我们不知道哪个部分需要 3-4 小时。并行执行可能会导致瓶颈移动,或者如果您尝试在慢速连接上过多堵塞,甚至可能导致失败。
  • 是压缩花费最多的时间还是网络传输?这将是一个开始。

标签: c# multithreading performance zip zipfile


【解决方案1】:

.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 进行文件压缩,而是网络传输,那么它可能无济于事。

【讨论】:

    【解决方案2】:

    我建议您使用Task.Factory.StartNew,因为它默认为每个内核创建 1 个线程,并排队另一个线程。

    【讨论】:

      【解决方案3】:

      根据我处理大文件的经验,由于硬盘读/写本身和/或网络的限制,多线程不会加快处理速度。

      您不仅要对硬盘进行大量读写操作,还要通过网络将大文件复制到另一台计算机。

      如果您的平均文件大小为 4.25 GB,那么我们正在处理的存储空间为 148.75 GB(按 35 个文件计)。这是一个很大的空间,你不仅要将所有空间读入内存(希望不是一次全部,否则虚拟内存将开始启动,它会向你的硬盘写入更多内容),你还写了一些该空间以 zip 文件的形式返回。

      将该因素添加到通过网络传输文件时,如果您的网络是我必须处理的典型网络,我一点也不感到惊讶。兆位和千兆位的速度从来都不是他们声称的那样。

      【讨论】:

        【解决方案4】:

        如果您使用外部实用程序进行压缩(即 7-zip),并且进程启动不是您的应用程序的问题,我会保持简单,只需 Process.Start() 与 7-zip EXE 一样多您需要(准)并行执行任务,或者一次执行一些任务,例如 5 个。由您决定。

        【讨论】:

          猜你喜欢
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 2018-01-11
          • 2010-09-21
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          相关资源
          最近更新 更多