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

person Wok    schedule 13.09.2013    source источник
comment
Вам просто не хватает памяти на платформе, которую вы используете?   -  person TheNickmaster21    schedule 13.09.2013
comment
Проблема действительно случайная: иногда я запускаю Matlab, и он не открывает ни одного файла, иногда он может открыть 50 файлов. Каждый раз, когда я открываю том, я назначаю его одной и той же переменной, поэтому необходимая память остается примерно неизменной и должна быть намного ниже технических характеристик моей системы.   -  person Wok    schedule 13.09.2013
comment
Хм... Я не сильно помогу; удачи!   -  person TheNickmaster21    schedule 13.09.2013
comment
Мне не повезло: 1) веб-сайт Matlab находится на обслуживании, поэтому вместо этого мне приходится ссылаться на Google Cache, и 2) я не могу воспроизвести проблему, что раздражает, поскольку обычно это происходит очень часто.   -  person Wok    schedule 13.09.2013


Ответы (3)


Если файлы, которые вы читаете, большие (их несжатая версия), это не должно быть утечкой памяти. Вы можете настроить использование Matlab пространства кучи java в настройках Matlab. Обычно устанавливается довольно маленькое значение 128 МБ — увеличьте его и посмотрите, сохранится ли проблема.

Чтобы проверить, не является ли это утечкой памяти, просто попробуйте:

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

Если есть утечка, это должно привести к ошибке, как только ваша куча снова заполнится. Если нет - ваш объем памяти должен оставаться в определенных пределах.

person sebastian    schedule 14.09.2013
comment
Спасибо. Дело в том, что мне удается открыть файлы, если я закрою Matlab и повторю попытку, и повторяю процесс, пока он не заработает, так что это действительно странно. - person Wok; 14.09.2013

Важно закрыть потоки, когда работа закончена, чтобы освободить память. Используйте try/catch чтобы гарантировать освобождение ресурсов даже в случае исключений.

Таким образом, вы должны вызвать c.close b.close a.close, чтобы иметь возможность обрабатывать большое количество файлов в цикле.

Примечание (не связанное с вашей ситуацией): известно, что в Java 8 происходит утечка собственной памяти, если java.util.zip.InflaterInputStream потоки не закрыты. Причина в замене реализации чистой Java вызовами Hotspot на zlib.

person Yves Martin    schedule 04.05.2017

Я могу опоздать, чтобы ответить на этот вопрос, но эту проблему с памятью можно решить, добавив файл 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-и-болеепоздниеверсии

person Shruti Naik110192    schedule 11.03.2015
comment
Спасибо за ответ. Никогда не поздно. Однако я не получаю ответа. Это текстовый файл с .opts java cmd, написанным внутри него? - person Wok; 11.03.2015