我一直在使用以下代码将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);
Run Code Online (Sandbox Code Playgroud)
这是有效的,并且比我使用"说"而不是打印的初始方法更快(感谢NYTProf对我的启发!)
但是,我当前的脚本循环遍历数十万行,并且使用此方法需要花费数小时才能运行,而NYTProf正在指责我的数千个'print'命令.所以,问题是...... 有更快的方法吗?
其他可能相关的信息... Perl版本:5.14.2(在Ubuntu上)
有问题的脚本的背景......一些'|' 分隔的平面文件正被读入哈希值,每个文件都有一些主键匹配条目从一个到另一个.我正在操纵这些数据,并将它们组合成一个文件以导入另一个系统.
输出文件大约是300万行,并且在向所述文件写入大约30,000行之后程序开始显着减慢.(有点阅读似乎指向其他语言的写缓冲区耗尽但我无法找到关于perl的任何内容?)
编辑:我现在尝试在open()语句之后添加以下行,以禁用打印缓冲,但程序仍然在第30,000行左右减速.
OUTPUT->autoflush(1);
Run Code Online (Sandbox Code Playgroud)
我认为你需要重新设计你的程序使用的算法.文件输出速度不受已输出数据量的影响,并且程序更有可能读取和处理数据但不释放数据.
检查进程使用的内存量,看它是否无情地增加
注意for (<$filehandle>)
循环,它会立即将整个文件读入内存
正如我在评论中所说,禁用相关print
语句以查看性能如何变化