Подозрение на утечку памяти Java в декомпрессии томов MHA в Matlab
У меня много томов хранится как .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);
3 ответа
Если файлы, которые вы читаете, являются большими (их несжатая версия), это не должно быть утечкой памяти. Вы можете настроить использование пространства кучи Java в Matlab в настройках Matlab. Обычно он имеет довольно маленькое значение 128 МБ - увеличьте его и посмотрите, не исчезнет ли проблема.
Чтобы проверить, является ли это утечкой памяти, просто попробуйте что-нибудь вместе:
for i=1:1000 % adjust loop-number to your needs
m = zlib_decompress(...)
end
Если есть утечка, это должно привести к ошибке, когда пространство кучи снова заполнится. Если нет - ваш след памяти должен оставаться в определенных пределах.
Когда работа закончена, важно закрыть потоки, чтобы освободить память. Используйте try/catch, чтобы обеспечить освобождение ресурсов даже в случае исключений.
Так что вы должны ссылаться c.close b.close a.close
чтобы иметь возможность обрабатывать большое количество файлов в цикле.
Примечание (не относится к вашей ситуации): известно, что в Java 8 происходит утечка собственной памяти, если java.util.zip.InflaterInputStream
потоки не закрыты. Причина заключается в замене чисто Java-реализации вызовами Hotspot на zlib
,
Я могу опоздать, чтобы ответить на этот вопрос, но эту проблему с памятью можно решить, добавив файл java.opts
в текущем каталоге рабочей области Matlab, где вы можете указать используемую память Matlab: