我有一個程序通過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文件,但它並不能幫助我很多= /:
請,我需要幫助。
那麼,該文件是一個有很多換行符的文本文件?從stacktrace看起來像'readLine()'試圖將文件的很大一部分放入一個數組中,這應該表明沒有(或很少)換行符。 – Steinar
我沒有想到這一點! 我不知道文件是如何的,他們只是給了我佈局,可能是誰傳送我的文件是做錯了,像往常一樣... 謝謝,明天我會回來的消息。 –
您是否嘗試過使用TrueZip:https://truezip.java.net/truezip-path/index.html – sendon1982