2014-04-14 22 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()会一直读取输入,直到达到换行符,这表示压缩输入文件中没有(或很少)换行符。

相关问题