【问题标题】:Most efficient way to concatenate thousands of files in Perl在 Perl 中连接数千个文件的最有效方法
【发布时间】:2018-12-10 10:33:06
【问题描述】:

我正在寻找连接数千个文件的最有效方法。到目前为止,我的做法(使用 Perl)是:我将打开源路径和目标路径,并将每一行插入目标文件。 当然,这将需要很多时间。我想使用 Linux 命令cat 来解决这个问题。但是从过去的线程中,我了解到 cat 有 MAX_ARG 将限制设置为命令行。 考虑您有一个数组@paths,其中包含所有要连接的路径。使用 Perl 将数千个文件连接到一个主文件(顺序无关紧要)的最有效方法是什么?

编辑:如果这很重要,连接文件可以达到3GB

【问题讨论】:

  • 以固定大小的块而不是逐行读取和写入内容。 $/ = \1024*1024*8;
  • 看看 shelll 命令xargs。也许这可以解决您的cat 命令文件过多的问题。
  • 请向我们展示您已有的代码。很可能应该是 use Path::Tiny; open my $out, '>', $outfilename or die "Couldn't write to '$outfilename': $!"; for my $in (@inputfiles) { print $out path($in)->slurp }
  • 数据块而不是行,使用sysreadsyswrite。或者可能使用File::Map 来读取文件。
  • 请允许我们为您谷歌:concatenate files using perl

标签: linux perl


【解决方案1】:
use IPC::Run qw( run );

run [ "xargs", "-0", "cat", "--" ],
   '<', \join("\0", @paths),
   '>', $output_qfn;

您也许可以使用find 来生成要连接的文件列表。

use IPC::Run qw( run );

run [ "find", ..., "-print0" ],
   '|' [ "xargs", "-0", "cat", "--" ],
      '>', $output_qfn;

在 GNU 系统(例如 Linux)上,使用 find 时可以避免使用 xargs

use IPC::Run qw( run );

run [ "find", ..., "-exec", "cat", "--", "{}", "+" ],
   '>', $output_qfn;

【讨论】:

  • @KjetilS.,这不是真的。 -exec ... +(相对于-exec ... ;)每个进程通过多个路径,就像xargs 一样。
  • 是的,我没有注意到-exec 末尾的+,而是想到了; 而不是+ 的行为。
猜你喜欢
  • 2021-04-15
  • 2017-09-09
  • 2021-08-30
  • 1970-01-01
  • 2017-06-13
  • 2017-02-12
  • 2022-08-18
  • 2013-06-10
  • 2014-12-06
相关资源
最近更新 更多