кэширование больших изображений
От: and_hom  
Дата: 22.06.07 18:22
Оценка:
Здравствуйте!
Есть проблема.

Программа работает с изображениями (отрисовка + минимум редактирования)
Изображения местами ощутимо большие: пятимегабайтный jpeg после распаковки весит точно больше 20 мегов. И всё это в опреативной памяти.

Применил ehcache с настройками

<cache name="images"
maxElementsInMemory="0"
maxElementsOnDisk="100000"
eternal="true"
timeToIdleSeconds="120"
timeToLiveSeconds="120"
overflowToDisk="true"
diskPersistent="true"
diskExpiryThreadIntervalSeconds="120"
memoryStoreEvictionPolicy="LFU"
/>

То есть, в памяти вообще ничего не должно быть (maxElementsInMemory="0").

Однако в дебаггере в elementsOnDisk элементов на один меньше, чем надо. Есть подозрения, что последний элемент в памяти.


Также возникла идея (возможно, это не очень красиво) отводить сразу некоторого размера int[] под изображение и читать его туда без лишних выделений памяти. Потому что сейчас из кэша читается int[], потом из него создаётся Image


MemoryImageSource mis = new MemoryImageSource(width, height, pixels,
                0, width);
        Toolkit tk = Toolkit.getDefaultToolkit();
        return tk.createImage(mis);


(уже два куска памяти размером с изображение)


При этом garbageCollector работает в последний момент и расход памяти выходит за рамки 100 мб (для маленького настольного клиента это много)



Что вообще делать в такой ситуации? И как это всё вообще оптимизировать?

Спасибо за любые предложения
 
Подождите ...
Wait...
Пока на собственное сообщение не было ответов, его можно удалить.