[英]Reading a file line-by-line with a timeout for lines that are taking too long?
我有一個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時文件可能已損壞。 我在serverA(它最初所在的服務器)和serverB(我從中將文件從s3中拉出的服務器)上的groupBy_new.json
上運行了上面的Python / Perl代碼,它們都在同一行停止了。 然后,我在原始文件groupBy.json
上運行了上面的Python / Perl代碼,它也停止了運行。 我試圖用與最初創建它時相同的代碼重新創建groupBy_new.json
,但遇到了OOM錯誤。
所以這是一個讓我感到困惑的真正奇怪的問題。 簡而言之,我想擺脫引起我麻煩的那條線。 我想要做的是讀取一個文件,該文件在正在讀取的行上具有超時。 如果它在2秒鍾左右的時間內無法讀取輸入行,請移至下一行。
您可以做的是計數直到問題行的行數並輸出-確保刷新輸出-請參閱https://perl.plover.com/FAQs/Buffering.html 。 然后編寫另一個程序,將這行的第一行復制到另一個文件,然后逐個字符讀取文件的輸入流(請參閱http://perldoc.perl.org/functions/read.html ),直到命中為止一個“ \\ n”,然后復制文件的其余部分-逐行或大塊復制。
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.