Perl Tie :: File模块的局限性

时间:2014-08-21 11:25:15

标签: perl

我尝试使用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分钟,它会引发错误!这是写这个通常的时间吗?

1 个答案:

答案 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 strictuse warnings。这对于任何Perl程序来说都是必需的,并且会很快揭示出许多您可能会忽略的简单问题。如果use strict到位,则必须使用my声明每个变量尽可能接近第一个使用点。