我一直在使用以下代码将perl脚本的输出写入文件:

open( OUTPUT, ">:utf8", $output_file ) or die "Can't write new file: $!";

print OUTPUT "First line I want printed\n";
print OUTPUT "Another line I want printing\n";

close(OUTPUT);

这行得通,并且比我最初使用“say”而不是打印品的初始方法要快(感谢NYTProf启发我!)

但是,我当前的脚本正在遍历数十万行,并且使用此方法要花费许多小时才能运行,而NYTProf却将矛头指向了我成千上万的“打印”命令。因此,问题是... 是否有更快的方法?

其他可能相关的信息...
Perl版本:5.14.2(在Ubuntu上)

有问题的脚本的背景...
多个“|”分隔的平面文件被读入哈希,每个文件都有某种主键匹配项,从另一个到另一个。我正在处理这些数据,并将它们组合到一个文件中,以导入到另一个系统中。

输出文件大约有300万行,在向该文件写入大约30,000行后,程序开始明显变慢。 (稍微阅读一下似乎会发现其他语言的写缓冲区已用完,但是在perl方面我什么都找不到吗?)

编辑:我现在尝试在open()语句之后添加以下行以禁用打印缓冲,但是该程序在第30,000行附近仍然变慢。
OUTPUT->autoflush(1);

最佳答案

我认为您需要重新设计程序使用的算法。文件输出速度不受已输出数据量的影响,程序更有可能正在读取和处理数据但未释放数据。

  • 检查您的进程使用的内存量,看它是否增加了
  • 谨防for (<$filehandle>)循环,该循环立即将整个文件读入内存中
  • 正如我在评论中所说,禁用相关的print语句以查看性能如何改变
  • 关于perl - 'print'在perl中归档的最快方法是什么?,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/9649957/

    10-11 19:22
    查看更多