在Matlab中对MHA卷的解压缩中怀疑java内存泄漏

时间:2013-09-13 13:13:47

标签: java matlab image-processing out-of-memory inflate

我有很多卷存储为.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);

3 个答案:

答案 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指定使用的内存:

http://de.mathworks.com/matlabcentral/answers/92813-how-do-i-increase-the-heap-space-for-the-java-vm-in-matlab-6-0-r12-and-later-versions