【问题标题】:Optimal way to Assemble a file组装文件的最佳方式
【发布时间】:2009-02-12 09:07:10
【问题描述】:

我有大量具有连续文件名的小文件,我想从中创建一个文件。最快的方法是什么?

例如

1.tgz.1  1.tgz.2  1.tgz.3   =========> 1.tgz

【问题讨论】:

  • 不要真的认为这是'assembler'标签所指的。实际上,也不确定为什么要标记 Java 和 C。
  • 这可能就是用户是“未知雅虎”的原因。 :-)(对不起@unknown(雅虎))
  • 我已经重新标记了这个问题。
  • 程序不仅需要在 shell 中。它可以在 C、java 或其他语言中。我需要最快的。
  • 最快的是猫。它从 Unix 开始就存在。有可能一些聪明人已经尽可能地对其进行了优化。如果您想提高时间性能,请考虑升级您的硬件。

标签: shell file


【解决方案1】:

你可以concatenate shell 中的文件。

在 Windows 中(/b 用于二进制模式):

copy /b   1.tgz.1 + 1.tgz.2 + 1.tgz.3   1.tgz

在 Unix/Linux 中:

cat   1.tgz.1 1.tgz.2 1.tgz.3   > 1.tgz

【讨论】:

  • 这需要相当长的时间...可以进一步优化吗?
  • 我认为 cat 是最快的手术!
  • 即使可以优化,我想优化也不会比 gunzip 和 tar 在大文件上花费的时间获得任何好处。
  • 在 Unix/Linux 上,您可以通过管道 cat 和 tar 节省一些磁盘空间: cat 1.tgz.1 1.tgz.2 1.tgz.3 |焦油 xzf -
【解决方案2】:

如果是大量个小文件,你不想被大量参数搞乱。

由于大多数 UNIX shell 按字母顺序扩展通配符,您应该使用:

cat 1.tgz.? 1.tgz.?? 1.tgz.??? >1.tgz

假设有 100 到 999 个文件(包括 100 到 999 个),请调整参数以处理更多或更少(例如,添加 1.t​​gz.???? 如果介于 1,000 到 9,9999 之间)。你不会获得更好的性能,因为你的瓶颈是磁盘速度,它总是比 CPU 上运行的代码慢。

我能想到的唯一其他可能性是:

  • 在单独的物理磁盘上创建 1.tgz。这可能会给您带来交错磁盘访问的优势。
  • 以 root 身份运行并使用nice 提高您的优先级(有关详细信息,请参阅man nice)。这将提高您获得更多 CPU 的能力,但同样,如果您受到磁盘 I/O 的限制,那将无济于事。

【讨论】:

    【解决方案3】:

    这是 bash(你的 shell 可能会有所不同):

    for n in *.tgz.* ; do cat $n >> ${n/tgz.*/tgz} ; done
    

    【讨论】:

      【解决方案4】:

      使用具有大块大小的dd,您可能会获得更好的性能:

      for n in *.tgz.* ; \
        dd if="$n" conv=notrunc oflag=append bs=4M of="somefile.tgz" ; \
      done
      

      【讨论】:

        猜你喜欢
        • 2012-11-27
        • 1970-01-01
        • 1970-01-01
        • 2011-07-10
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        相关资源
        最近更新 更多