0

我有许多存储为.mha文件的卷,我通常使用名为 的函数在 Matlab 中打开这些文件,mha_read_volume您可以在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);
4

3 回答 3

2

当作业结束以释放内存时,关闭流很重要。使用try/catch 确保即使在异常情况下也能释放资源。

因此,您应该调用c.close b.close a.close以便能够循环处理大量文件。

备注(与您的情况无关):如果java.util.zip.InflaterInputStream流未关闭,Java 8 会泄漏本机内存。原因是通过 Hotspot 调用替换了纯 Java 实现zlib

于 2017-05-04T15:57:56.427 回答
1

如果您读取的文件很大(它们的未压缩版本),这不需要是内存泄漏。您可以在 matlab 首选项中调整 matlab 使用的 java 堆空间。通常它被设置为 128 MB 的一个相当小的值 - 增加它,看看问题是否仍然存在。

要检查它是否是内存泄漏,只需尝试以下操作:

for i=1:1000 % adjust loop-number to your needs
m = zlib_decompress(...)
end

如果有泄漏,一旦你的堆空间再次满了,这应该会出错。如果不是 - 您的内存占用量应保持在一定范围内。

于 2013-09-14T10:45:58.077 回答
-1

我可能会迟到回答这个问题,但是这个内存问题可以通过java.opts在 Matlab 工作区的当前目录中添加文件来解决,您可以在其中指定 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-更高版本

于 2015-03-11T13:33:46.723 回答