我有一個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++;
}
他們都放大,直到他們打線173646264,然後他們就完全停止。讓我簡單介紹一下這個文件。
我創建了一個名爲groupBy.json
的文件。然後我用一些Java代碼處理該文件以轉換JSON對象並創建一個名爲groupBy_new.json
的文件。我在s3上放置groupBy_new.json
,在另一臺服務器上將其拉下,並在開始發生OOM錯誤時對其進行一些處理。我想,當轉移到s3時,文件可能已損壞。我在serverA(原來的服務器)上的groupBy_new.json
上運行了上面的Python/Perl代碼,而serverB(我從中將服務器從s3上刪除了該文件)都在同一行停止。我跑了,然後在原始文件groupBy.json
上運行了上面的Python/Perl代碼,並且它也停止了。我試圖用我以前創建它的相同代碼重新創建groupBy_new.json
,並且遇到了OOM錯誤。
所以這是一個非常奇怪的問題,令我困惑。總之,我想擺脫這種導致我出現問題的線路。我想要做的是讀取正在讀取的行上超時的文件。如果在2秒左右無法讀取輸入行,請繼續閱讀下一行。
如果你在那條線上得到了一個OOM,那麼這條線可能很長時間才能加載到內存中(許多GB?取決於你的機器)。您不能跳過該行,因爲要跳過我們需要知道該行結束的行,而不讀取該行。作爲一種解決方法,您可能需要將文件讀入固定大小的緩衝區並執行自己的分行。 – amon
我使用的系統有64GB內存,我將堆大小設置爲30GB。我現在將輸入文件分成更小的塊。希望這是有效的。如果沒有,我會嘗試在更大的系統上運行代碼。 –