我有一个程序通过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