2017-10-07 32 views
1

我有一個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秒左右無法讀取輸入行,請繼續閱讀下一行。

+3

如果你在那條線上得到了一個OOM,那麼這條線可能很長時間才能加載到內存中(許多GB?取決於你的機器)。您不能跳過該行,因爲要跳過我們需要知道該行結束的行,而不讀取該行。作爲一種解決方法,您可能需要將文件讀入固定大小的緩衝區並執行自己的分行。 – amon

+0

我使用的系統有64GB內存,我將堆大小設置爲30GB。我現在將輸入文件分成更小的塊。希望這是有效的。如果沒有,我會嘗試在更大的系統上運行代碼。 –

回答