Подозрение на утечку памяти 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:

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

Другие вопросы по тегам