在perl中“打印”文件的最快方法是什么?

时间:2012-03-10 20:34:04

标签: perl buffer

我一直在使用以下代码将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);

这是有效的,并且比我使用“说”而不是打印的初始方法更快(感谢NYTProf对我有所启发!)

但是,我当前的脚本循环遍历数十万行,并且使用此方法需要花费数小时才能运行,而NYTProf正在指责我的数千个'print'命令。所以,问题是...... 有更快的方法吗?

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

有问题的剧本背景...... 一些'|'分隔的平面文件正被读入哈希值,每个文件都有一些主键匹配条目从一个到另一个。我正在操纵这些数据,并将它们组合成一个文件以导入另一个系统。

输出文件大约有300万行,并且在向所述文件写入大约30,000行之后程序开始显着减慢。 (有点阅读似乎指向其他语言的写缓冲区耗尽但我无法找到关于perl的任何内容?)

编辑:我现在尝试在open()语句之后添加以下行来禁用打印缓冲,但程序仍然在第30,000行左右减速。

OUTPUT->autoflush(1);

2 个答案:

答案 0 :(得分:5)

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

  • 检查您的流程使用的内存量,看它是否无情地增加

  • 小心for (<$filehandle>)循环,一次将整个文件读入内存

  • 正如我在评论中所述,停用相关的print语句,了解效果如何变化

答案 1 :(得分:3)

您是否尝试将所有单个打印件连接到单个标量中,然后一次打印标量?我有一个脚本,每个输入行平均输出20行文本。使用单独的print语句时,即使将输出发送到/ dev / null,也需要很长时间。但是当我将所有输出(对于单个输入行)打包在一起时,使用以下内容:

$output .= "...";

$output .= sprintf("%s...", $var);

然后就在离开行处理子程序之前,我'打印$ output'。一次打印所有行。打印调用次数从~7.7M到约386K - 等于输入日期文件中的行数。这使我的总执行时间减少了大约10%。