捕获多个文件的最快方法是什么?

Win*_*ing 19 unix concatenation cat

我想知道是否有办法将unix文本文件连接在一起比运行更快file1

这是我面临的问题.我正在处理一个大小为100G的文本文件.我试图通过将文件分成数百个较小的文件并并行处理来改善运行时.最后,我按顺序将生成的文件重新组合在一起.文件读/写时间本身需要数小时.我想找到一种方法来改善以下方面:

cat file1 file2 file3 ... fileN >> newBigFile
Run Code Online (Sandbox Code Playgroud)
  1. 这需要将磁盘空间加倍,因为fileN...... newBigFile占用100G,然后file1需要另外100Gb,然后fileN...... file1被删除

  2. 数据已经在fileN...中cat >>,file1当我真正需要的是数百个文件重新出现为1个文件时,会产生读写时间......

Jay*_*ker 10

如果您不需要随机访问最终的大文件(即,您只需从头到尾阅读一次),您就可以将数百个中间文件显示为一个.你通常会做什么

$ consume big-file.txt
Run Code Online (Sandbox Code Playgroud)

相反

$ consume <(cat file1 file2 ... fileN)
Run Code Online (Sandbox Code Playgroud)

这使用Unix 进程替换,有时也称为"匿名命名管道".

您也可以通过拆分输入并同时进行处理来节省时间和空间; GNU Parallel有一个--pipe开关,可以做到这一点.它还可以将输出重新组合成一个大文件,可能使用较少的临时空间,因为它只需要在磁盘上同时保留核心数量.如果您实际上同时运行数百个进程,则Parallel会通过调整计算机的并行度来大大提高效率.我强烈推荐它.


小智 7

我相信这是捕获同一文件夹中包含的所有文件的最快方法:

$ ls [path to folder] | while read p; do cat $p; done
Run Code Online (Sandbox Code Playgroud)


the*_*ejh 5

也许dd会更快,因为你不必在cat和shell之间传递东西.就像是:

mv file1 newBigFile
dd if=file2 of=newBigFile seek=$(stat -c %s newBigFile)
Run Code Online (Sandbox Code Playgroud)


Rob*_*sak 5

将文件串联在一起时,可以在附加小文件时删除它们:

for file in file1 file2 file3 ... fileN; do
  cat "$file" >> bigFile && rm "$file"
done
Run Code Online (Sandbox Code Playgroud)

这样可以避免需要两倍的空间。

没有其他方法可以神奇地使文件神奇地串联在一起。文件系统API根本没有执行此操作的功能。


Rob*_*t P 3

快速但不是免费的解决方案?获取 SSD 驱动器或基于 PCIe 的闪存存储。如果这是必须定期完成的事情,那么提高磁盘 IO 速度将是您可以获得的最具成本效益和最快的加速。

  • 当然,您的情况可能会禁止这样做,但如果将其作为现有服务器磁盘存储的附加项(而不是替代品)提交给管理层,则可以考虑这样做。如果您可以拥有一个仅用于此任务的 SSD,并且每天可以节省 2 小时的处理时间,我想他们会相信节省了成本。 (2认同)