我有很多卷存储为.mha
文件,我通常使用名为mha_read_volume
的函数在Matlab中打开这些文件,您可以在Matlab Central找到该函数。我的问题是这个函数随机抛出与使用某些java库解压缩这些图像相关的内存不足错误消息。
罪魁祸首似乎在于:
function M = zlib_decompress(Z,DataType)
import com.mathworks.mlwidgets.io.InterruptibleStreamCopier
a=java.io.ByteArrayInputStream(Z);
b=java.util.zip.InflaterInputStream(a);
isc = InterruptibleStreamCopier.getInterruptibleStreamCopier;
c = java.io.ByteArrayOutputStream;
isc.copyStream(b,c);
M=typecast(c.toByteArray,DataType);
我怀疑内存泄漏,但我不知道如何处理此代码来解决问题。
以下是错误消息:
??? Java exception occurred:
java.lang.OutOfMemoryError: Java heap space
at java.util.Arrays.copyOf(Unknown Source)
at java.io.ByteArrayOutputStream.toByteArray(Unknown Source)
Error in ==> mha_read_volume>zlib_decompress at 87
M=typecast(c.toByteArray,DataType);
Error in ==> mha_read_volume at 74
V = zlib_decompress(Z,DataType);
答案 0 :(得分:2)
在作业结束时关闭流以释放内存非常重要。即使出现例外,也请使用try/catch to ensure resources are freed。
因此,您应该调用c.close b.close a.close
以便能够循环处理大量文件。
备注(与您的情况无关):如果java.util.zip.InflaterInputStream
流未关闭,则已知Java 8会泄漏本机内存。原因是Hotspot调用zlib
替换了纯Java实现。
答案 1 :(得分:1)
如果您读取的文件很大(未压缩的版本),则不需要进行内存泄漏。 您可以在matlab首选项中调整matlab使用的java堆空间。 通常将其设置为128 MB的相当小的值 - 增加它并查看问题是否仍然存在。
要检查是否是内存泄漏,只需尝试一下:
for i=1:1000 % adjust loop-number to your needs
m = zlib_decompress(...)
end
如果存在泄漏,一旦堆空间再次满,就应该出错。 如果不是 - 你的记忆足迹应该保持在一定限度内。
答案 2 :(得分:-1)
我可能会迟到回答这个问题,但是这个内存问题可以通过在Matlab工作区的当前目录中添加文件java.opts
来解决,你可以通过Matlab指定使用的内存: