我有一个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秒左右无法读取输入行,请转到下一行。
答案 0 :(得分:2)
你可以做的是计算问题行之前的行数并输出它 - 确保你刷新输出 - 见https://perl.plover.com/FAQs/Buffering.html。然后编写另一个程序,将该行数中的第一行复制到另一个文件,然后逐个字符地读取该文件的输入流(参见http://perldoc.perl.org/functions/read.html),直到它到达&#34; \ N'#34;然后复制文件的其余部分 - 逐行或块。