我有许多卷存储为.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);发布于 2013-09-14 10:45:58
如果您读取的文件很大(它们的未压缩版本),这不需要是内存泄漏。您可以调整matlab在matlab首选项中使用的java堆空间。通常,它被设置为128 MB的较小值--增加它并查看问题是否仍然存在。
要检查它是否是内存泄漏,只需尝试一些内容:
for i=1:1000 % adjust loop-number to your needs
m = zlib_decompress(...)
end如果有漏洞,一旦堆空间再次被填满,就会出现错误。如果没有-你的内存占用应该保持在一定的限度内。
发布于 2017-05-04 15:57:56
当作业结束释放内存时,关闭流是很重要的。即使在异常情况下也使用尝试/捕捉以确保资源被释放。
因此,您应该调用c.close b.close a.close来处理循环中的大量文件。
注意(与您的情况无关):如果java.util.zip.InflaterInputStream流不关闭,Java 8就会泄漏本机内存。原因是将纯Java实现替换为对zlib的Hotspot调用。
发布于 2015-03-11 13:33:46
我可能会很晚才回答这个问题,但是这个内存问题可以通过在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
https://stackoverflow.com/questions/18787226
复制相似问题