powered by simpleCommunicator - 2.0.61     © 2026 Programmizd 02
Целевая тема:
Создать новую тему:
Автор:
Закрыть
Цитировать
Форумы / Java [игнор отключен] [закрыт для гостей] / Что может пожирать память?
25 сообщений из 40, страница 1 из 2
Что может пожирать память?
    #38967193
вадя
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
что в этом коде не оптимально, что можно сделать для уменьшения потребления памяти?
-Xmx256m спасает для однозадачного использования, но есть опасения что при большем числе пользователей и этого будет мало..
(сервер tomcat, debian)
Код: java
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
14.
15.
16.
17.
18.
19.
20.
21.
22.
23.
24.
25.
26.
27.
28.
29.
30.
31.
32.
33.
34.
35.
36.
37.
38.
39.
40.
41.
42.
43.
44.
45.
46.
47.
48.
49.
50.
51.
52.
53.
54.
55.
56.
57.
58.
59.
60.
61.
62.
63.
64.
65.
66.
67.
68.
69.
70.
71.
72.
public void yyy(String param) {
      try {
            InputStream inp;
            BufferedImage image;
            double height;
            double step;
            double k;
            ImageWriter imgWriter;
            ImageWriteParam imgWriteParams;
            HSSFPictureData pictureData;
            File file;
            int n;
            Row row;
            HSSFPicture picture;
            imgWriteParams = new WebPWriteParam(null);

            System.out.println(r.maxMemory());
            inp = new FileInputStream("C:\\Temp\\Новая папка (2)\\" + param);
            Workbook workbook = WorkbookFactory.create(inp);
            HSSFSheet sheet = (HSSFSheet) workbook.getSheetAt(0);
            HSSFPatriarch patriarch = sheet.getDrawingPatriarch();

            if (patriarch != null) {
                // Loop through the objects
                for (HSSFShape shape : patriarch.getChildren()) {
                    if (shape instanceof HSSFPicture) {
                        picture = (HSSFPicture) shape;
                        if (picture.getShapeType() == HSSFSimpleShape.OBJECT_TYPE_PICTURE) {
                            // how to get cell, which contains this picture
                            if (picture.getImageDimension() != null) {
                                row = sheet.getRow(picture.getPreferredSize().getRow1());
                                if (row != null) {
                                    System.out.print(row.getRowNum() + "   ");
                                    pictureData = picture.getPictureData();
                                    image = ImageIO.read(new ByteArrayInputStream(pictureData.getData()));
                                    height = image.getRaster().getHeight();
                                    step = Math.ceil(Math.log(height / 60.0) / Math.log(2));
                                    k = (60.0 * Math.pow(2.0, step)) / height;
                                    System.out.println(k);
                                    image = ScaleDescriptor.create(image, (float) k, (float) k, 0f, 0f, Interpolation.getInstance(Interpolation.INTERP_BILINEAR), null).getAsBufferedImage();
                                    n = (int) step;
                                    while (n-- > 0) {
                                        image = ScaleDescriptor.create(image, 0.5f, 0.5f, 0f, 0f, Interpolation.getInstance(Interpolation.INTERP_BILINEAR), null).getAsBufferedImage();
                                    }

                                    imgWriter = ImageIO.getImageWritersByFormatName("webp").next();

                                    imgWriteParams.setCompressionType("Lossy");
                                    imgWriteParams.setCompressionQuality(.5f);
                                    file = new File("C:\\Temp\\Новая папка (2)\\" + (row.getRowNum() + 1) + "_" + picture.getPreferredSize().getCol1() + "_" + picture.getPictureIndex() + "_.webp");
                                    Iterator iter = row.iterator();
                                    while (iter.hasNext()) {
                                        Object next = iter.next();
                                        System.out.println("    " + next.toString());
                                    }
                                    Files.deleteIfExists(file.toPath());
                                    try (ImageOutputStream imageOutputStream = ImageIO.createImageOutputStream(file)) {
                                        imgWriter.setOutput(imageOutputStream);
                                        imgWriter.write(null, new IIOImage(image, null, null), imgWriteParams);
                                    }
                                }
                            }
                        }
                    }
                }
            }
        } catch (FileNotFoundException ex) {
            Logger.getLogger(Page7.class.getName()).log(Level.SEVERE, null, ex);
        } catch (IOException | InvalidFormatException ex) {
            Logger.getLogger(Page7.class.getName()).log(Level.SEVERE, null, ex);
        }
    }

...
Рейтинг: 0 / 0
Что может пожирать память?
    #38967194
вадя
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
ЗЫ
код для варианта отладки под окнами
...
Рейтинг: 0 / 0
Что может пожирать память?
    #38967243
забыл ник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
вр-первых ничего не ответит лучше чем дамп памяти. Во-вторых про закрытие инпутсримов и сопуствующее не слышали да?
...
Рейтинг: 0 / 0
Что может пожирать память?
    #38967248
вадя
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
забыл никвр-первых ничего не ответит лучше чем дамп памяти. Во-вторых про закрытие инпутсримов и сопуствующее не слышали да?
в каком месте не закрыто и что?
...
Рейтинг: 0 / 0
Что может пожирать память?
    #38967250
вадя
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
2 Blazkowicz
это несколько пересекается с 15821941
только используеися https://bitbucket.org/luciad/webp-imageio
можешь подсказать ?
...
Рейтинг: 0 / 0
Что может пожирать память?
    #38967347
Фотография Dmitry.
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
я бы посмотрел на PlanarImage.dispose()

и зачем ресайз одной картинки делается в цикле?
Код: java
1.
2.
3.
while (n-- > 0) {
	image = ScaleDescriptor.create(image, ...).getAsBufferedImage();
}
...
Рейтинг: 0 / 0
Что может пожирать память?
    #38967375
вадя
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Dmitry.я бы посмотрел на PlanarImage.dispose()

и зачем ресайз одной картинки делается в цикле?
Код: java
1.
2.
3.
while (n-- > 0) {
	image = ScaleDescriptor.create(image, ...).getAsBufferedImage();
}


это "хитрое умеьшение размера"
дело в том, что если сразу уменьшить то качество картинки будет ужасным.
поэтому необходимо уменьшать по шагам не более чем 2 раза.
http://m.habrahabr.ru/post/252175/ тут хорошо описано как это сделать.
...
Рейтинг: 0 / 0
Что может пожирать память?
    #38967382
вадя
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
авторя бы посмотрел на PlanarImage.dispose()
а куда в моём коде это применить?

так?
Код: java
1.
2.
3.
4.
5.
try (ImageOutputStream imageOutputStream = ImageIO.createImageOutputStream(file)) {
                                            imgWriter.setOutput(imageOutputStream);
                                            imgWriter.write(null, new IIOImage(image, null, null), imgWriteParams);
                                            imgWriter.dispose();
                                        }

...
Рейтинг: 0 / 0
Что может пожирать память?
    #38967385
вадя
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
и как из этого
Код: java
1.
 imgWriter.write(null, new IIOImage(image, null, null), imgWriteParams);


получить ещё и byte[]
...
Рейтинг: 0 / 0
Что может пожирать память?
    #38967410
Фотография Blazkowicz
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
вадяэто "хитрое умеьшение размера"
дело в том, что если сразу уменьшить то качество картинки будет ужасным.
поэтому необходимо уменьшать по шагам не более чем 2 раза.
http://m.habrahabr.ru/post/252175/ тут хорошо описано как это сделать.
Там же на хабре была более внятная статья об уменьшении изображений. По-моему достаточно первым шагом сделать размытие. Тогда не будет резких перепадов от пропавших пикселей при уменьшении на втором шаге.
...
Рейтинг: 0 / 0
Что может пожирать память?
    #38967416
вадя
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Blazkowiczвадяэто "хитрое умеьшение размера"
дело в том, что если сразу уменьшить то качество картинки будет ужасным.
поэтому необходимо уменьшать по шагам не более чем 2 раза.
http://m.habrahabr.ru/post/252175/ тут хорошо описано как это сделать.
Там же на хабре была более внятная статья об уменьшении изображений. По-моему достаточно первым шагом сделать размытие. Тогда не будет резких перепадов от пропавших пикселей при уменьшении на втором шаге.
размытие не спасает от пропавших пикселей, какая разница размытый оригинал или нет - сам ресайз в несколько раз за раз даёт это.
постепенное уменьшение даже для фотошопа необходимо (если это не прописано у него в коде)
это дествует и для ресайза в браузере и в (как оказалось для java)
я столкнулся с этим когда делаю превьюшки (высотой 60 пикселей) из большого оригинала.
так делает и браузер когда уменьшаешь изображение - сначала картинка становится маленькой, рябой, потом качество улучшается, рябь пропадает.
если кто захочет убедиться - есть тестовое java приложение - могу скинуть.
это увеличивает время преобразования, но нет пройгрыша в качестве.

ЗЫ. вопросы в силе
...
Рейтинг: 0 / 0
Что может пожирать память?
    #38967420
Фотография Blazkowicz
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
вадяразмытие не спасает от пропавших пикселей, какая разница размытый оригинал или нет - сам ресайз в несколько раз за раз даёт это.
Такая, что информация размыта по соседним пикселям. Поэтому устранение соседнего пикселя не ведёт к катастрофически заметным дефектам.

вадяпостепенное уменьшение даже для фотошопа необходимо (если это не прописано у него в коде)

https://ru.wikipedia.org/wiki/Argumentum_ad_verecundiam

вадяэто дествует и для ресайза в браузере и в (как оказалось для java)

И жрет кучу ресурсов. Тем про ресайз уже было 100500.
http://rsdn.ru/forum/java/2277129.1

вадяя столкнулся с этим когда делаю превьюшки (высотой 60 пикселей) из большого оригинала.

Blur таки пробовал или нет?

вадяЗЫ. вопросы в силе
Ну, видно что POI не стримит никак. Можно попробовать изображения из POI, для начала, скинуть на диск. И потом его стримить при чтении. Но вообще стоит просто посчитать расходы памяти на хранение запакованного изображения, распакованного 24-битного растра, и результатов каждой итерации. И только потом решать действительно ли реальное потребление памяти сильно превосходит ожидаемое.
...
Рейтинг: 0 / 0
Что может пожирать память?
    #38967469
вадя
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
дефект проявляется в том, что появляются белые точки, и это как бы мало зависит от размытия, да и операция размытия тоже занимает и время и память. да и сами фотки уже качества размытые...

по https://ru.wikipedia.org/wiki/Argumentum_ad_verecundiam
мои заявления из практики это уж поверь на слово.

http://rsdn.ru/forum/java/2277129.1 проверю, про ресайз - у меня уже есть давно работающий код, но он изменял размер не в 4-5 раз, и на нём этот дефект не проявлялся. ну и меня интересует формат webp.
этот дефект проявляется очень заметко когда картинка преобразуется c изменением рамера 10+ раз.

работа через диск - это уж на самый полследний случай, потому как обрабатывается из экселя в цикле до 300 картинок.

по потреблению памяти понятно, что работа с картинками затратная по памяти, меня интересовал вопрос с точки зрения правильности кода, его оптимизации.
...
Рейтинг: 0 / 0
Что может пожирать память?
    #38967502
Фотография Blazkowicz
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
вадядефект проявляется в том, что появляются белые точки, и это как бы мало зависит от размытия
Откуда они появляются??

вадя, да и операция размытия тоже занимает и время и память. да и сами фотки уже качества размытые...
Размытие можно реализовать на то же растре с минимальными потерями по памяти. Но будет дольше, это да.

вадяпо https://ru.wikipedia.org/wiki/Argumentum_ad_verecundiam
мои заявления из практики это уж поверь на слово.

Ну, просто, если практики много, то должно быть понимание что и от чего, а не "в фотошопе тоже так"

вадя http://rsdn.ru/forum/java/2277129.1 проверю, про ресайз - у меня уже есть давно работающий код, но он изменял размер не в 4-5 раз, и на нём этот дефект не проявлялся. ну и меня интересует формат webp.

Формат не при чем. Это же растр.

вадяэтот дефект проявляется очень заметко когда картинка преобразуется c изменением рамера 10+ раз.

Вот этого я не учел. Давно не ресайзил. Картинки за эти годы подросли.

вадяработа через диск - это уж на самый полследний случай, потому как обрабатывается из экселя в цикле до 300 картинок.

Ну, тогда это не последний случай, а единственный, который поможет сэкономить память. А если планируется многопользовательский сервер, то стоит, наверное масштабирование в очередь загонять и ограничить по ресурсам.

вадяпо потреблению памяти понятно, что работа с картинками затратная по памяти, меня интересовал вопрос с точки зрения правильности кода, его оптимизации.
Ну, код стремный. Многоуровневые условия. Жирнючее тело. Хорошо бы побить на несколько методов.
...
Рейтинг: 0 / 0
Что может пожирать память?
    #38967538
вадя
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
авторНу, просто, если практики много, то должно быть понимание что и от чего, а не "в фотошопе тоже так"
как я уже двал http://m.habrahabr.ru/post/252175/, там немного сказано из-за чего такое может быть, это вроде совпадает с моими наблюдениями и выводами (на абсолютную истину не претендую) по поводу приминительно к фотошопу - ещё лет 10 назад сталкивался с подобнами рекомендациями - но там рекомендовали менять размер не более чем на 5-10% за раз.
авторНу, тогда это не последний случай, а единственный, который поможет сэкономить память. А если планируется многопользовательский сервер, то стоит, наверное масштабирование в очередь загонять и ограничить по ресурсам.

вот тут и хочется узнать что жрет память. как работает такая строка
Код: java
1.
image = ScaleDescriptor.create(image, (float) k, (float) k, 0f, 0f, Interpolation.getInstance(Interpolation.INTERP_BILINEAR), null).getAsBufferedImage();


т.е. получается что требуется двойной объём ?
или правильнее сделать через дополнительный объект
Код: java
1.
image1 = ScaleDescriptor.create(image, (float) k, (float) k, 0f, 0f, Interpolation.getInstance(Interpolation.INTERP_BILINEAR), null).getAsBufferedImage();


с последующим удалением image? через gс?
авторНу, код стремный. Многоуровневые условия. Жирнючее тело. Хорошо бы побить на несколько методов.
по условиям тоже не нравится, но с POI не работал, поэтому взял "как есть" , если есть рекомендации по сокращению - поделись.
как может помочь деление тела на методы? там вроде не так и жирно.
покажи что там можно изменить.
...
Рейтинг: 0 / 0
Что может пожирать память?
    #38967551
Фотография Blazkowicz
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
вадя, у тебя и чтение, и масштабирование и запись, всё в одном методе. А это минимум 3 разных операции.
...
Рейтинг: 0 / 0
Что может пожирать память?
    #38967561
вадя
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
там чтение экселевского файла
далее перебор картинок из него - есть смысл выносить чтение в отдельный метод? и возвращать этот набор, если помимо этого надо обработать и данные по ячейкам?
вынести в отдельный метод масштабирование? что это принципиально изменит? наглядность кода - вопрос спорный, экономию памяти?
ну а выносить в метод 5 строчек записи ? для увелечения числа строк программы?
я просто не вижу большого смысла в этом. возможно я ошибаюсь - поправь.
унификации и многократное использования этого кода в других местах проекта на планируется.
...
Рейтинг: 0 / 0
Что может пожирать память?
    #38967685
Сергей Арсеньев
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
вадякак я уже двал http://m.habrahabr.ru/post/252175/, там немного сказано из-за чего такое может быть,
Код: java
1.
image = ScaleDescriptor.create(image, (float) k, (float) k, 0f, 0f, Interpolation.getInstance(Interpolation.INTERP_BILINEAR), null).getAsBufferedImage();



Если внимательно почитать, что написано в указанной вами статье про то, что масштабирование на canvas сделано простейшим методом, а писать другие на javascript влом, и посмотрев на константы класса Interpolation, то можно задать вопрос - здесь то что мешает?
...
Рейтинг: 0 / 0
Что может пожирать память?
    #38967773
ivanra
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
В принципе непонятно, зачем пользоваться ScaleDescriptor'ом из 2006 года, плюс многократное сжатие, когда нужно просто подобрать хинты для преобразования. Может, этот ScaleDescriptor и пожирает.
Вот мне где-то попался набор, вполне удовлетворительно работает
Код: java
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
14.
15.
16.
17.
18.
19.
20.
	BufferedImage source = ...;
	int w = source.getWidth(), h = source.getHeight();
	int tw = (int)((double)w*scale), th = (int)((double)h*scale);
	// Create the image
	BufferedImage image = new BufferedImage(tw, th, BufferedImage.TYPE_INT_RGB);
	// Create the graphics
	Graphics2D graphics = image.createGraphics();
	try {
		// Set rendering hints
		graphics.setRenderingHint(RenderingHints.KEY_ANTIALIASING, RenderingHints.VALUE_ANTIALIAS_ON);
		graphics.setRenderingHint(RenderingHints.KEY_RENDERING, RenderingHints.VALUE_RENDER_QUALITY);
		graphics.setRenderingHint(RenderingHints.KEY_INTERPOLATION, RenderingHints.VALUE_INTERPOLATION_BICUBIC);
		// draw scaled
		graphics.drawImage(source, 0, 0, (int)(w * scale), (int)(h * scale), null);
	} finally {
		// Always dispose the graphics
		graphics.dispose();
	}
	// Write the rescaled image
	ImageIO.write(image, "jpg", outStream);
...
Рейтинг: 0 / 0
Что может пожирать память?
    #38967793
вадя
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
ivanra,
у меня тоже есть другой код для ресайза, рабочий..
я твой тоже проверю, спасибо.
а ты делал этим кодом ресайз из картинки 1000*1000 в 60*60? есть возможность проверить?
счас смартфоны и большее число пикселей дают

авторЕсли внимательно почитать, что написано в указанной вами статье про то, что масштабирование на canvas сделано простейшим методом, а писать другие на javascript влом, и посмотрев на константы класса Interpolation, то можно задать вопрос - здесь то что мешает?
честно не всё понял из написанного..
если про этоInterpolation.INTERP_BILINEAR - пробывал все варианты.

ещё раз повторю - сложность заключается в изменении размера в БОЛЬШОЕ КОЛИЧЕСТВО РАЗ
в проекте есть и преобразование загружаемых картинок в браузере по методу из той статьи. пусть он будет и простейший, но других мне не удалось найти. все ресайзят через канвас, либо через флэш (ну его только мне не хватало)
...
Рейтинг: 0 / 0
Что может пожирать память?
    #38967804
вадя
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
авторВ принципе непонятно, зачем пользоваться ScaleDescriptor'ом из 2006 года, плюс многократное сжатие,

я воспользовался этим вариантом https://bitbucket.org/luciad/webp-imageio/overview
...
Рейтинг: 0 / 0
Что может пожирать память?
    #38967811
ivanra
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
вадя,
при сильном изменении масштаба эти параметры важны:
ANTIALIASING - сглаживание "лесенок" у кривых
INTERPOLATION_BICUBIC - всяко лучше билинейной интерполяции (указана в первом сообщении), так как результирующее значение пикселя вычисляется из 9 соседей, а не из 4-х
...
Рейтинг: 0 / 0
Что может пожирать память?
    #38967831
ivanra
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
вадяivanra,
у меня тоже есть другой код для ресайза, рабочий..
я твой тоже проверю, спасибо.
а ты делал этим кодом ресайз из картинки 1000*1000 в 60*60? есть возможность проверить?
счас смартфоны и большее число пикселей дают
У нас уменьшаются фотографии объектов (тоже со смартфонов и мыльниц). Правда, не так сильно - до 160 по бОльшей стороне, на экране монитора это примерно как 2 кадра 35мм пленки, сложенные вместе
...
Рейтинг: 0 / 0
Что может пожирать память?
    #38967846
Фотография mayton
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
вадя, так что? Разобрался что пожирает память? Кто этот загадочный "лангольер"... ?
...
Рейтинг: 0 / 0
Что может пожирать память?
    #38967931
вадя
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
maytonвадя, так что? Разобрался что пожирает память? Кто этот загадочный "лангольер"... ?
пока нет.
надо проверить код ivanra и Blazkowicz
а для этого надо набраться смелости :)
если есть мысли что можно поправить с наименьшими переделками - проверю.
...
Рейтинг: 0 / 0
25 сообщений из 40, страница 1 из 2
Форумы / Java [игнор отключен] [закрыт для гостей] / Что может пожирать память?
Найденые пользователи ...
Разблокировать пользователей ...
Читали форум (0):
Пользователи онлайн (0):
x
x
Закрыть


Просмотр
0 / 0
Close
Debug Console [Select Text]