【发布时间】:2018-03-25 19:25:31
【问题描述】:
我有一个函数可以解压缩使用 zlib 库(改编自 here)打包的字节数组 Z。
- 打包后的数据大小为 4.11 GB,解压后的数据为 6.65 GB。我有 32GB 的内存,所以这远低于限制。
- 我尝试将 Java 堆大小增加到 15.96GB,但这没有帮助。
- MATLAB_JAVA 环境变量指向 jre1.8.0_144。
我得到了一个神秘的错误
'MATLAB array exceeds an internal Java limit.'
在此代码的第 2nd 行:
import com.mathworks.mlwidgets.io.InterruptibleStreamCopier
a=java.io.ByteArrayInputStream(Z);
b=java.util.zip.GZIPInputStream(a);
isc = InterruptibleStreamCopier.getInterruptibleStreamCopier;
c = java.io.ByteArrayOutputStream;
isc.copyStream(b,c);
M=typecast(c.toByteArray,'uint8');
尝试执行 Mark Adler 的建议:
Z=reshape(Z,[],8);
import com.mathworks.mlwidgets.io.InterruptibleStreamCopier
a=java.io.ByteArrayInputStream(Z(:,1));
b=java.util.zip.GZIPInputStream(a);
for ct = 2:8,b.read(Z(:,ct));end
isc = InterruptibleStreamCopier.getInterruptibleStreamCopier;
c = java.io.ByteArrayOutputStream;
isc.copyStream(b,c);
但是在这个isc.copystream 我得到这个错误:
Java exception occurred:
java.io.EOFException: Unexpected end of ZLIB input stream
at java.util.zip.InflaterInputStream.fill(Unknown Source)
at java.util.zip.InflaterInputStream.read(Unknown Source)
at java.util.zip.GZIPInputStream.read(Unknown Source)
at java.io.FilterInputStream.read(Unknown Source)
at com.mathworks.mlwidgets.io.InterruptibleStreamCopier.copyStream(InterruptibleStreamCopier.java:72)
at com.mathworks.mlwidgets.io.InterruptibleStreamCopier.copyStream(InterruptibleStreamCopier.java:51)
直接从文件中读取 我尝试直接从文件中读取数据。
streamCopier = com.mathworks.mlwidgets.io.InterruptibleStreamCopier.getInterruptibleStreamCopier;
fileInStream = java.io.FileInputStream(java.io.File(filename));
fileInStream.skip(datastart);
gzipInStream = java.util.zip.GZIPInputStream( fileInStream );
baos = java.io.ByteArrayOutputStream;
streamCopier.copyStream(gzipInStream,baos);
data = baos.toByteArray;
baos.close;
gzipInStream.close;
fileInStream.close;
适用于小文件,但我得到大文件:
Java exception occurred:
java.lang.OutOfMemoryError
在线streamCopier.copyStream(gzipInStream,baos);
【问题讨论】:
-
可能并不真正相关,但仍然 - 您是否确定要解压缩这种大小的支持文件的文件系统? (即 FAT32 支持最大 4GB 的文件)。可能值得在问题中添加java 标记,看看您正在使用的函数如何在内部使用java...您尝试过
tall数组吗? -
感谢您的评论。都是NTFS。我添加了java。也许我确实应该以某种方式让流复制器使用高阵列。如果我找到解决方案,我会在这里发布。
标签: java matlab gzip zlib matlab-java