2014-04-14 48 views
0

我有一個程序通過namedpipes將數據加載到數據庫中,非常酷。 該程序運行約2年,接受文本文件或gzip。「java.lang.OutOfMemoryError:Java堆空間」在閱讀巨大的zip文件時

但現在出現了一些zip加載,我想改善它。但我不能把這個工作,我得到一個OutOfMemoryError。

(當然,我打電話這種使用-Xms512m -Xmx2048M)

下面是我得到的InputStream:

PipeLoader.java

protected BufferedReader getBufferedReader(File file, String compression) throws Exception { 
    BufferedReader bufferedReader = null; 

    if(compression.isEmpty()) { 
     bufferedReader = new BufferedReader(new FileReader(file), BUFFER); 
    } else if(compression.equalsIgnoreCase("gzip")) { 
     InputStream fileStream = new FileInputStream(file); 
     InputStream gzipStream = new GZIPInputStream(fileStream); 

     // Works fine 
     Reader reader = new InputStreamReader(gzipStream); 
     bufferedReader = new BufferedReader(reader, BUFFER); 
    } else if(compression.equalsIgnoreCase("zip")){ 
     InputStream fileStream = new FileInputStream(file); 
     ZipInputStream zipStream = new ZipInputStream(fileStream); 
     zipStream.getNextEntry(); // For testing purposes I'm getting only the first entry 

     Reader reader = new InputStreamReader(zipStream); // Works only with small zips 
     bufferedReader = new BufferedReader(reader, BUFFER); 
    } 

    return bufferedReader; 
} 

我也試過TrueVFS庫:

// The same: works with small zip files, OutOfMemoryError with big zip files 
TFile tFile = new TFile(file); 
TFileInputStream tfis = new TFileInputStream(new TFile(tFile.getAbsolutePath(), tFile.list()[0])); 

Reader reader = new InputStreamReader(tfis); 
bufferedReader = new BufferedReader(reader, BUFFER); 

是的,我正在關閉一切正常(記住,與gz工作!)。

在這種情況下我需要加載一些zip文件只有1純文本文件內(〜4GB拉鍊,〜35GB未壓縮)

我在第一個文件一個OutOfMemoryError,在不到從開始1分鐘。

PS:這不是從Reading a huge Zip file in java - Out of Memory Error複製,他可以選擇從zip內讀取每個小文件,但我只有一個大文件。

我跑了-XX:+ HeapDumpOnOutOfMemoryError和readed與內存分析器的.hprof文件,但它並不能幫助我很多= /:

MemoryAnalyser.png

請,我需要幫助。

+0

那麼,該文件是一個有很多換行符的文本文件?從stacktrace看起來像'readLine()'試圖將文件的很大一部分放入一個數組中,這應該表明沒有(或很少)換行符。 – Steinar

+0

我沒有想到這一點! 我不知道文件是如何的,他們只是給了我佈局,可能是誰傳送我的文件是做錯了,像往常一樣... 謝謝,明天我會回來的消息。 –

+0

您是否嘗試過使用TrueZip:https://truezip.java.net/truezip-path/index.html – sendon1982

回答

1

如果您查看堆棧跟蹤,您可以看到BufferedReader.readLine()最終導致創建非常大的數組,這導致了OutOfMemoryError

由於readLine()會一直讀取輸入,直到達到換行符,這表示壓縮輸入文件中沒有(或很少)換行符。

相關問題