我尝试使用Tie:File
模块编写一个文本文件,该文件应包含10亿行,但在写入1600万后会抛出错误
"Out of memory!"
"Callback called exit at C:/perl/lib/Tie/File.pm line 979 during global destruction."
这是我尝试过的代码。
use Tie::File;
tie @array, 'Tie::File', "Out.txt";
$start = time();
for ($i = 0; $i <= 15000000; $i++) {
$array[$i].= "$i,";
}
$end = time();
print("time taken: ", $end - $start, "seconds");
untie @array;
我不知道它为什么会抛出错误。解决这个问题的任何解决方编写1600万条记录也花了大约55分钟,它会引发错误!这是写这个通常的时间吗?
答案 0 :(得分:3)
已知Tie:File
模块速度很慢,最好在随机访问文件行的优势超过性能不佳的情况下使用。
但这不是模块的问题,它是Perl的限制。或者,更准确地说,是计算机系统的限制。如果您将模块从情境中取出并尝试创建一个包含1,000,000,000个元素的普通数组,那么Perl将会因Out of memory!
错误而死亡。我的32位Perl 5版本20的限制大约是3000万。对于64位版本,它将会更多。
Tie:File
不会将整个文件保留在内存中,但会将其分页进出以节省空间,因此可以处理非常大的文件。只是不那大!
在这种情况下,您不需要Tie:File
的优势,您应该将数据按顺序写入文件。像这样的东西
use strict;
use warnings;
use 5.010;
use autodie;
open my $fh, '>', 'Out.txt';
my $time = time;
for my $i (0 .. 15_000_000) {
print $fh "$i,\n";
}
$time = time - $time;
printf "Time taken: %d seconds\n", $time;
这个程序在我的系统上运行了七秒钟。
请在计划开始时注意use strict
和use warnings
。这对于任何Perl程序来说都是必需的,并且会很快揭示出许多您可能会忽略的简单问题。如果use strict
到位,则必须使用my
声明每个变量尽可能接近第一个使用点。