对于耗时太长的行,逐行读取文件会超时吗?

时间:2017-10-07 13:01:25

标签: python perl

我有一个1.2TB文件,我正在运行一些代码,但不断遇到OutOfMemoryError例外。我针对该文件运行了以下两段代码,看看出了什么问题:

import sys

with open(sys.argv[1]) as f:
    count = 1
    for line in f:
        if count > 173646280:
            print line
        else:
            print count
            count += 1

这段代码:

#!/usr/bin/env perl
use strict;
use warnings;

my $count = 1;
while (<>) {
    print "$count\n";
    $count++;
}

它们都会变焦直到它们达到173,646,264行,然后它们就完全停止了。让我简单介绍一下该文件。

我创建了一个名为groupBy.json的文件。然后,我使用一些Java代码处理该文件以转换JSON对象并创建名为groupBy_new.json的文件。我将groupBy_new.json放在s3上,将其拉到另一台服务器上,并在我开始收到OOM错误时对其进行了一些处理。我想这可能是文件在转移到s3时被破坏了。我在服务器A(它最初所在的服务器)上运行上面的groupBy_new.json上的Python / Perl代码,以及我从中删除文件的服务器B(服务器),两者都停在同一行。我跑了然后在原始文件groupBy.json上运行了上面的Python / Perl代码,它也停止了。我尝试使用与我最初创建它时相同的代码重新创建groupBy_new.json,并遇到OOM错误。

所以这是一个令我困惑的奇怪问题。简而言之,我想摆脱导致我出现问题的这条线。我想要做的是读取正在读取的行超时的文件。如果它在2秒左右无法读取输入行,请转到下一行。

1 个答案:

答案 0 :(得分:2)

你可以做的是计算问题行之前的行数并输出它 - 确保你刷新输出 - 见https://perl.plover.com/FAQs/Buffering.html。然后编写另一个程序,将该行数中的第一行复制到另一个文件,然后逐个字符地读取该文件的输入流(参见http://perldoc.perl.org/functions/read.html),直到它到达&#34; \ N'#34;然后复制文件的其余部分 - 逐行或块。