powered by simpleCommunicator - 2.0.29     © 2024 Programmizd 02
Map
Форумы / Java [игнор отключен] [закрыт для гостей] / Stream и память
132 сообщений из 132, показаны все 6 страниц
Stream и память
    #40126085
adminDontSleep
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
Может кто то подсказать такой вопрос

Код: java
1.
2.
3.
4.
5.
6.
7.
 public long getSurveyResultInProgressCount(long surveyId) {
    return surveyResultIdentitiesPersistDelayedMap.keySet()
      .stream()
      .map(this::getCachedByIdentity)
      .filter(x -> x.getSurveyId() == surveyId)
      .count();
  }


например есть такой метод- что он делает - идет в кеш за мапой - берет коллекцию ключей-по этим ключам в кеше находит нужные объекты ,фильтрует и считает

вопрос простой на этапе вот этом

Код: java
1.
 .map(this::getCachedByIdentity)

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

и если же будут целиком объекты то если мы возьмем их id только

например вот так
Код: java
1.
2.
3.
4.
5.
6.
7.
8.
 public long getSurveyResultInProgressCount(long surveyId) {
    return surveyResultIdentitiesPersistDelayedMap.keySet()
      .stream()
      .map(this::getCachedByIdentity)
      .map(SurveyResult::getSurveyId)
      .filter(x -> x == surveyId)
      .count();
  }
...
Рейтинг: 0 / 0
Stream и память
    #40126102
PetroNotC Sharp
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
adminDontSleep,
Вопрос переформулируй по взрослому.
...
Рейтинг: 0 / 0
Stream и память
    #40126103
adminDontSleep
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
PetroNotC Sharp
adminDontSleep,
Вопрос переформулируй по взрослому.

что именно тебе не понятно в вопросе?
...
Рейтинг: 0 / 0
Stream и память
    #40126105
PetroNotC Sharp
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
adminDontSleep,
А) слово "болтаться"
Б) нет второго вопроса.
))))
...
Рейтинг: 0 / 0
Stream и память
    #40126108
PetroNotC Sharp
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
adminDontSleep,
Ну загрузились в память объекты. После использования сборщик все собрал.
Тебе то что?
Учитывая "преждевременная оптимизация зло!" можно спросить про твой термин "болтаться"))))
Ну а визуально первый кусок кода лучше и понятнее.
Тогда занафига ты портишь код?
...
Рейтинг: 0 / 0
Stream и память
    #40126109
adminDontSleep
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
PetroNotC Sharp
adminDontSleep,
А) слово "болтаться"
Б) нет второго вопроса.
))))


смотри стрим начинается с получения из мапы кей сета - мы получаем множество UUID
по этим UUID мы достаем из кеша Объекты

далее мы преобразуем стрим из этих объектов в стрим идентификаторов


и далее фильтруем по неким условиям и считаем сумму элеметов в стриме

ворпос в том будут ли в памяти все время работы этого метода все Объекты которые мы выбрали из кеша?
...
Рейтинг: 0 / 0
Stream и память
    #40126111
adminDontSleep
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
PetroNotC Sharp
adminDontSleep,
Ну загрузились в память объекты. После использования сборщик все собрал.
Тебе то что?
Учитывая "преждевременная оптимизация зло!" можно спросить про твой термин "болтаться"))))
Ну а визуально первый кусок кода лучше и понятнее.
Тогда занафига ты портишь код?


проблема в том что не хочется в память тащить такого количество объектов ,во первых они достаточно объемные и их очень много ,а хип не резиновый
поэтому и возник вопрос - если все время работы метода все объекты будут в хипе - то такое мне не подходит ,если же элемент после второго map будет кандидат на удаление - то это уже более интересно .Но я подозреваю что пока метод целиком не отработает на все этим элементы будут ссылки из стрима и хип раздуется ровно на количество этих элеентов - что мне конечно же не подходит
...
Рейтинг: 0 / 0
Stream и память
    #40126112
PetroNotC Sharp
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
adminDontSleep,
Тебе не сложно счас сгенерить стрим на 10млн?
Ты прошлый раз 5 страниц экономил память, а тормозила субд.
...
Рейтинг: 0 / 0
Stream и память
    #40126113
Фотография mayton
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
PetroNotC Sharp, чего ты на парня набросился. Он вполне себе хороший вопрос задает.
И своевременный. Беспокоиться о ресурсах. Я вижу 2 варианта. Первое - найти в API
описание того как работает стрим-процессинг. И второе - мемори профайлер. И смотреть.
...
Рейтинг: 0 / 0
Stream и память
    #40126118
Фотография mayton
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Вот по 17-шке пишут.

https://docs.oracle.com/en/java/javase/17/docs/api/java.base/java/util/stream/package-summary.html

The key abstraction introduced in this package is stream. The classes Stream, IntStream, LongStream, and DoubleStream are streams over objects and the primitive int, long, and double types. Streams differ from collections in several ways:

No storage. A stream is not a data structure that stores elements; instead, it conveys elements from a source such as a data structure, an array, a generator function, or an I/O channel, through a pipeline of computational operations.
Functional in nature. An operation on a stream produces a result, but does not modify its source. For example, filtering a Stream obtained from a collection produces a new Stream without the filtered elements, rather than removing elements from the source collection.
Laziness-seeking. Many stream operations, such as filtering, mapping, or duplicate removal, can be implemented lazily, exposing opportunities for optimization. For example, "find the first String with three consecutive vowels" need not examine all the input strings. Stream operations are divided into intermediate (Stream-producing) operations and terminal (value- or side-effect-producing) operations. Intermediate operations are always lazy.
Possibly unbounded. While collections have a finite size, streams need not. Short-circuiting operations such as limit(n) or findFirst() can allow computations on infinite streams to complete in finite time.
Consumable. The elements of a stream are only visited once during the life of a stream. Like an Iterator, a new stream must be generated to revisit the same elements of the source.


Но я-бы использвал не keySet а .entrySet(). Вот какое-то у меня есть предчувствие что лучше брать тот итератор
который уже дан без лишних преобразований.

Код: java
1.
2.
3.
4.
 public long getSurveyResultInProgressCount(long surveyId) {
    return surveyResultIdentitiesPersistDelayedMap.entrySet()
    ....
  }
...
Рейтинг: 0 / 0
Stream и память
    #40126130
PetroNotC Sharp
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
mayton,
Совсем нет.
Ты силен в алгоритмизации. Я в архитектуре.
Почему у нас должны быть одинаковые вопросы.
Я ставлю оценку за технику а ты за артистизм))))
Ты правда думаешь что надо переписать код?
...
Рейтинг: 0 / 0
Stream и память
    #40126133
Фотография mayton
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Ты чего градус повышаешь? Обсуждай код а не людей.
...
Рейтинг: 0 / 0
Stream и память
    #40126153
adminDontSleep
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
[quot mayton#22420011]Вот по 17-шке пишут.

https://docs.oracle.com/en/java/javase/17/docs/api/java.base/java/util/stream/package-summary.html

The key abstraction introduced in this package is stream. The classes Stream, IntStream, LongStream, and DoubleStream are streams over objects and the primitive int, long, and double types. Streams differ from collections in several ways:

No storage. A stream is not a data structure that stores elements; instead, it conveys elements from a source such as a data structure, an array, a generator function, or an I/O channel, through a pipeline of computational operations.
Functional in nature. An operation on a stream produces a result, but does not modify its source. For example, filtering a Stream obtained from a collection produces a new Stream without the filtered elements, rather than removing elements from the source collection.
Laziness-seeking. Many stream operations, such as filtering, mapping, or duplicate removal, can be implemented lazily, exposing opportunities for optimization. For example, "find the first String with three consecutive vowels" need not examine all the input strings. Stream operations are divided into intermediate (Stream-producing) operations and terminal (value- or side-effect-producing) operations. Intermediate operations are always lazy.
Possibly unbounded. While collections have a finite size, streams need not. Short-circuiting operations such as limit(n) or findFirst() can allow computations on infinite streams to complete in finite time.
Consumable. The elements of a stream are only visited once during the life of a stream. Like an Iterator, a new stream must be generated to revisit the same elements of the source.


все равно не очень понятно если я из кеша выбираю объекты - хранятся ли они где то или нет?
тоесть первой операцией у нас идет получние ключей из мапы- тут все нормально - мапа уже в памяти - к ней ворпосов нет
вопрос в том что я получаю далее стрим объектов - и преобразую его в стрим идентификаторов - и мой вопрос простой - что будет с объектами - которые я достал из кэша - будут ли они храниться в хипе пока метод не отработал либо же сразу после преобразования стрима объектов в стрим идентификаторов - объекты будут помечены на удаление

проверять я конечно проверю- но может быть кто то знает и сталкивался с этим
...
Рейтинг: 0 / 0
Stream и память
    #40126158
PetroNotC Sharp
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
mayton
Ты чего градус повышаешь? Обсуждай код а не людей.
ты только градусы видишь. Я столько фактов выше привел.
Пусть ТС сделает тест что кончилась память.
Это же разумно?
Тебе некуда же бежать и спешить?
Верно?
Я именно это просил ТС.
...
Рейтинг: 0 / 0
Stream и память
    #40126161
PetroNotC Sharp
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
adminDontSleep
мой вопрос простой
мой тоже. Он из жизни.
"ТС работает больше отвечающих" (с)
...
Рейтинг: 0 / 0
Stream и память
    #40126166
Фотография mayton
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
adminDontSleep

все равно не очень понятно если я из кеша выбираю объекты - хранятся ли они где то или нет?
тоесть первой операцией у нас идет получние ключей из мапы- тут все нормально - мапа уже в памяти - к ней ворпосов нет
вопрос в том что я получаю далее стрим объектов - и преобразую его в стрим идентификаторов - и мой вопрос простой - что будет с объектами - которые я достал из кэша - будут ли они храниться в хипе пока метод не отработал либо же сразу после преобразования стрима объектов в стрим идентификаторов - объекты будут помечены на удаление

проверять я конечно проверю- но может быть кто то знает и сталкивался с этим

В данной реализации мы просто пробегаем по коллекции ключей. Которые уже расположены в heap.

Если верить документации то stream не создает дополнительных коллекций до тех пор пока ты сам явно
об этом не попросишь в методе Collect например.


P.S. Немного напрягает твоя терминология. Ты говоришь "кеш". Это потому что ты его так назвал? Или
под интерфейсом Map у тебя скрыта реализация EhCache или чего-то подобного?
...
Рейтинг: 0 / 0
Stream и память
    #40126170
PetroNotC Sharp
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
mayton,
+1
Про кеш верно.
Если это кеш1 то мы рожаем объект из бд в оперативке из бд,
Если это кеш2 то мы пробегаем по объектам.
Если...
Гадание гадалок а не программистов.
...
Рейтинг: 0 / 0
Stream и память
    #40126207
adminDontSleep
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
mayton
adminDontSleep

все равно не очень понятно если я из кеша выбираю объекты - хранятся ли они где то или нет?
тоесть первой операцией у нас идет получние ключей из мапы- тут все нормально - мапа уже в памяти - к ней ворпосов нет
вопрос в том что я получаю далее стрим объектов - и преобразую его в стрим идентификаторов - и мой вопрос простой - что будет с объектами - которые я достал из кэша - будут ли они храниться в хипе пока метод не отработал либо же сразу после преобразования стрима объектов в стрим идентификаторов - объекты будут помечены на удаление

проверять я конечно проверю- но может быть кто то знает и сталкивался с этим

В данной реализации мы просто пробегаем по коллекции ключей. Которые уже расположены в heap.

Если верить документации то stream не создает дополнительных коллекций до тех пор пока ты сам явно
об этом не попросишь в методе Collect например.


P.S. Немного напрягает твоя терминология. Ты говоришь "кеш". Это потому что ты его так назвал? Или
под интерфейсом Map у тебя скрыта реализация EhCache или чего-то подобного?

кеш в данном случае это хезель каст
...
Рейтинг: 0 / 0
Stream и память
    #40126209
PetroNotC Sharp
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
adminDontSleep
хезель
ну он же настраивается. Меньше памяти жрать или больше.
mayton верно же сказал. Если все в кеше в оперативке, то память не меняется в методе.
Тяжело выбросить в лог замер по памяти?
...
Рейтинг: 0 / 0
Stream и память
    #40126210
PetroNotC Sharp
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Как то, смотрим свой код но абсолютно ничего не делаем.
...
Рейтинг: 0 / 0
Stream и память
    #40126226
Фотография mayton
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
adminDontSleep
mayton
пропущено...

В данной реализации мы просто пробегаем по коллекции ключей. Которые уже расположены в heap.

Если верить документации то stream не создает дополнительных коллекций до тех пор пока ты сам явно
об этом не попросишь в методе Collect например.


P.S. Немного напрягает твоя терминология. Ты говоришь "кеш". Это потому что ты его так назвал? Или
под интерфейсом Map у тебя скрыта реализация EhCache или чего-то подобного?

кеш в данном случае это хезель каст

А Hazelcast в данном случае является главным источником данных? Или он просто является слоем перед DBMS?
...
Рейтинг: 0 / 0
Stream и память
    #40126227
adminDontSleep
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
PetroNotC Sharp
adminDontSleep
хезель
ну он же настраивается. Меньше памяти жрать или больше.
mayton верно же сказал. Если все в кеше в оперативке, то память не меняется в методе.
Тяжело выбросить в лог замер по памяти?

конечно тяжело-это же динамический процесс - его нужно отловить- тоесть когда система будет нагружена достаточно
если делать замеры на тестовой среде - нужно просить тестировщиков - а это геморой- проше на форуме спрсоить - может кто то знает как оно там работает под капотом

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

если есть кто не согласен с этим - прошу к дискуссии
...
Рейтинг: 0 / 0
Stream и память
    #40126228
Basil A. Sidorov
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
adminDontSleep
проблема в том что не хочется в память тащить такого количество объектов ,во первых они достаточно объемные и их очень много ,а хип не резиновый
Проблема совсем в другом.
Есть "объект" и "данные объекта".
"Объект" это "указатель на данные объекта и сами данные" (они могут храниться раздельно) или "указатель на (другой) объект".
Если объект это какой-нибудь Long, то указатель на данные объекта будет больше, чем сами данные.
Если объект это какой-нибудь байтовый буфер на пару килобайт, то указатель на данные объекта - пренебрежимо мал.
Так вот - данные объекта не копируются, если вы специально этим не озаботились.
...
Рейтинг: 0 / 0
Stream и память
    #40126229
adminDontSleep
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
mayton
adminDontSleep
пропущено...

кеш в данном случае это хезель каст

А Hazelcast в данном случае является главным источником данных? Или он просто является слоем перед DBMS?

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

Но я повторюсь - меня интересует как будет огранизована работа памяти в данной цепочке

колекция UUID -по ней получаем из кэша- стрим объектов - мапим в стрим других объектов( например в лонги) фильтруем и считаем количество элементов

вот на каждом этом этапе интересует поведение памяти
...
Рейтинг: 0 / 0
Stream и память
    #40126231
adminDontSleep
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
Basil A. Sidorov
adminDontSleep
проблема в том что не хочется в память тащить такого количество объектов ,во первых они достаточно объемные и их очень много ,а хип не резиновый
Проблема совсем в другом.
Есть "объект" и "данные объекта".
"Объект" это "указатель на данные объекта и сами данные" (они могут храниться раздельно) или "указатель на (другой) объект".
Если объект это какой-нибудь Long, то указатель на данные объекта будет больше, чем сами данные.
Если объект это какой-нибудь байтовый буфер на пару килобайт, то указатель на данные объекта - пренебрежимо мал.
Так вот - данные объекта не копируются, если вы специально этим не озаботились.

в целом ты прав,но забываешь о том ,что объекты изнчально находятся в кеще(в данном случае это хезель каст) и чтобы стрим начал с ними работать я думаю они будут целиком загружены в хип
...
Рейтинг: 0 / 0
Stream и память
    #40126247
Фотография mayton
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
adminDontSleep

колекция UUID -по ней получаем из кэша- стрим объектов - мапим в стрим других объектов( например в лонги) фильтруем и считаем количество элементов

вот на каждом этом этапе интересует поведение памяти

Дьявол в деталях. Я - не специалист в Хазел. Я даже его не использовал. Но я использовал Apache Ignite.
Это такой себе брат-близнец по функционалу. И вот учет памяти в Ignite осложняется тем что объекты
не лежат в heap. Они лежат в оперативке но не в JavaHeap. Это одна деталь. Надо узнать как Хазел
хранит ключи и значения. Возможно он тоже как-то оптимизирует техники хранения. Это нужно
поскольку во всех in-memory кешах делают защиту от лишней активности GC кидая их нативную
память.

И еще одна деталь. Начиная с Java 14 появился новй API (кажется foreign memory) который чего-то
там улучшает для offheap. Проверь какая Java. На что влияет? Ну как всегда на удобства использования.
И надо проверить как это использует Hazel.

Что еще посмотреть? Посмотри JMX-компоненты которые мониторят память в Hazel. Желательно
их дампить в текстовый файл каждые 3-5 секунд и отображать в Graphana. Это важно во время твоего тестирования ключей.

Тоесть такой юзкейс который ты придумал как учёт количества ключей - вытекает в такой сложный
investigation.
...
Рейтинг: 0 / 0
Stream и память
    #40126248
PetroNotC Sharp
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
adminDontSleep
я думаю они будут целиком загружены в хип
слишком много "я думаю".
Если загружены то память не изменится. Если не загружены то памятью заведует ПО а не сборщик мусора.
И т.д. и т.п.
Без проверки твои догадки ноль.
...
Рейтинг: 0 / 0
Stream и память
    #40126250
PetroNotC Sharp
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
У хазел настройка по умолчснию хранить в памяти 1000 обьектов. Остыльные в хранилище.
Тут мы тыкаем палочкой в слона и даже не видим ответ.
Так как ТС не у компа и не у кода.
...
Рейтинг: 0 / 0
Stream и память
    #40126253
Basil A. Sidorov
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
adminDontSleep
в целом ты прав,но забываешь о том ,что объекты изнчально находятся в кеще(в данном случае это хезель каст) и чтобы стрим начал с ними работать я думаю они будут целиком загружены в хип
"Смешались в кучу кони, люди ..."
Если ваш Hazelcast работает в процессе вашей JVM, то рантайм, скорее всего, предоставит вам ссылки на объекты из кэша Hazelcast без дополнительных усилий с вашей стороны.
Ну или читатйте доки этого самого Hazelcast-а.
...
Рейтинг: 0 / 0
Stream и память
    #40126257
Basil A. Sidorov
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
mayton
Начиная с Java 14 появился новй API (кажется foreign memory) который чего-то
там улучшает для offheap.
Вот не надо этого ...
В Java14 появился JEP 352: Non-Volatile Mapped Byte Buffers для NIO и с ограничениями на поддерживаемые системы.
А JEP 393: Foreign-Memory Access API (Third Incubator) продолжал оставаться инкубаторе на Java16.
И в Java17 он тоже остаётся в инкубаторе как часть JEP 412: Foreign Function & Memory API (Incubator) .
...
Рейтинг: 0 / 0
Stream и память
    #40126259
adminDontSleep
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
Basil A. Sidorov
adminDontSleep
в целом ты прав,но забываешь о том ,что объекты изнчально находятся в кеще(в данном случае это хезель каст) и чтобы стрим начал с ними работать я думаю они будут целиком загружены в хип
"Смешались в кучу кони, люди ..."
Если ваш Hazelcast работает в процессе вашей JVM, то рантайм, скорее всего, предоставит вам ссылки на объекты из кэша Hazelcast без дополнительных усилий с вашей стороны.
Ну или читатйте доки этого самого Hazelcast-а.

хезель каст в данном случае работает как отдельный процесс в докер контейнере
...
Рейтинг: 0 / 0
Stream и память
    #40126261
PetroNotC Sharp
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
adminDontSleep
Basil A. Sidorov
пропущено...
"Смешались в кучу кони, люди ..."
Если ваш Hazelcast работает в процессе вашей JVM, то рантайм, скорее всего, предоставит вам ссылки на объекты из кэша Hazelcast без дополнительных усилий с вашей стороны.
Ну или читатйте доки этого самого Hazelcast-а.

хезель каст в данном случае работает как отдельный процесс в докер контейнере
все таки ппреходим на тему - как работает хезель. Это будет правильнее.
...
Рейтинг: 0 / 0
Stream и память
    #40126277
Basil A. Sidorov
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
adminDontSleep
хезель каст в данном случае работает как отдельный процесс в докер контейнере
Тогда я опять худею:
1. Процессы изолированы и бессмысленно рассуждать откуда именно ваш процесс берёт объекты: они у него точно есть (вместе со всеми их данным) и они (все) - в куче.
2. "Оптимизация" использования памяти вашим процессом - оно точно надо???
...
Рейтинг: 0 / 0
Stream и память
    #40126279
PetroNotC Sharp
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Basil A. Sidorov,
Он боится что выскочит райзе - Память кончилась.
...
Рейтинг: 0 / 0
Stream и память
    #40126331
Basil A. Sidorov
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
PetroNotC Sharp, не надо домысливать за человека.
Я, например, домысливаю, что он занимает преждевременной оптимизацией, но, всё-таки, не пытаюсь озвучивать свои домыслы.
...
Рейтинг: 0 / 0
Stream и память
    #40126333
Фотография mayton
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Я думаю тема топика - оптимизация памяти. Но мне кажется что она не про Java а про Хазелкаст.
Надо читать его мануалы и учебники. Если выборка всех ключей из Hazelcast - это антипаттерн, тогда
про это должно быть упоминание. Убежден что эта тема проскакивала в Quora, Stackover e.t.c.

По поводу стримов. Я очень сильно рекомендую автору переписать этот блок на обычный цикл for.

Код: java
1.
2.
3.
4.
5.
        return surveyResultIdentitiesPersistDelayedMap.keySet()
                .stream()
                .map(this::getCachedByIdentity)
                .filter(x -> x.getSurveyId() == surveyId)
                .count();



Это займет 5 минут. Всяко быстрее чем еще много страниц обсуждать несуществующие технические долги.
И тогда все вопросы по Java стримам отпадут и останутся только чистые вопросы эксплуатации Хазелкаст.

Будем рубить ненужные хвосты.
...
Рейтинг: 0 / 0
Stream и память
    #40126336
PetroNotC Sharp
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Basil A. Sidorov
PetroNotC Sharp, не надо домысливать за человека.
Я, например, домысливаю, что он занимает преждевременной оптимизацией, но, всё-таки, не пытаюсь озвучивать свои домыслы.

Преждевременная оптимизация для чего?
Ответ - для того чтобы не было райзе по памяти. Или вы не память оптимизируете?
Очевидность а не домыслы))) LOL
...
Рейтинг: 0 / 0
Stream и память
    #40126337
PetroNotC Sharp
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
mayton,
Ничего он не поправит, не залогирует и не проверит.
Он выше сказал.
А значит топик тихо умрет.
...
Рейтинг: 0 / 0
Stream и память
    #40126343
Фотография mayton
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
PetroNotC Sharp, придержи коней

Если используется правильный LRU то чтение кеша вызовет только рециркуляцию сущностей
но не вызовет обязательно OutOfMemory.
...
Рейтинг: 0 / 0
Stream и память
    #40126345
PetroNotC Sharp
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
mayton
PetroNotC Sharp, придержи коней

Если используется правильный LRU то чтение кеша вызовет только рециркуляцию сущностей
но не вызовет обязательно OutOfMemory.
разумеется.
Попробуй сам скажи для чего автор ОПТИМИЗИРУЕТ.
Цель то какая?
Слава богу в термине Оптимизация у нас консенсус
...
Рейтинг: 0 / 0
Stream и память
    #40126348
Фотография mayton
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Может ему задачу такую поставили. Разобраться. Вот он сидит и разбирается.
Не всегда люди приходят в sql.ru с конкретными вопросами. Иногда с сомнениями.
Вот почитай посты Андрейки. О чем там? Я не понимаю. Просто эмоциональный блог.
...
Рейтинг: 0 / 0
Stream и память
    #40126351
Фотография mayton
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Вот выборка ключей по предикату

https://docs.hazelcast.com/hazelcast/5.0/query/querying-maps-predicates

Наподобие SELECT .. WHERE в базах данных.
...
Рейтинг: 0 / 0
Stream и память
    #40126355
adminDontSleep
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
mayton
Может ему задачу такую поставили. Разобраться. Вот он сидит и разбирается.
Не всегда люди приходят в sql.ru с конкретными вопросами. Иногда с сомнениями.
Вот почитай посты Андрейки. О чем там? Я не понимаю. Просто эмоциональный блог.

все верно есть задача - а я выбираю как лучше сделать,объекты находятся в кеше( хезель каст) -
нужно взять все имеющиеся там объекты взять у них атрибут по нему отфильтровать и посчить сумму объектов

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

да все верно это преждевременная оптимизация- но и собственно интерес к тому,как это будет выглять в памяти
...
Рейтинг: 0 / 0
Stream и память
    #40126358
Фотография mayton
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Вот чудак. Делай средствами Хазелькаста. Или ты думаешь что ты умнее и хитрее его создателей?
...
Рейтинг: 0 / 0
Stream и память
    #40126363
PetroNotC Sharp
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
mayton
Может ему задачу такую поставили. Разобраться. Вот он сидит и разбирается.
Не всегда люди приходят в sql.ru с конкретными вопросами. Иногда с сомнениями.
Вот почитай посты Андрейки. О чем там? Я не понимаю. Просто эмоциональный блог.
ну ему и сказано. Без работы руками а просто бла бла топик умрет.
Ему решать)
...
Рейтинг: 0 / 0
Stream и память
    #40126364
adminDontSleep
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
mayton
Вот чудак. Делай средствами Хазелькаста. Или ты думаешь что ты умнее и хитрее его создателей?

хорошо вот средствами хезелькаста

Код: java
1.
2.
3.
4.
5.
public long getSurveyResultInProgressCount(long surveyId) {
    PredicateBuilder.EntryObject e = Predicates.newPredicateBuilder().getEntryObject();
    Predicate predicate =e.get("surveyId").equal(surveyId);
    return surveyResultIMap.values(predicate).size();
  }



я правильно понимаю что вот эта строчка
Код: java
1.
surveyResultIMap.values(predicate)

все таки вытащит в хип джава процесса эту коллекцию - пусть и уже отфильтрованную ,либо же в хип попадет только size()
...
Рейтинг: 0 / 0
Stream и память
    #40126369
Фотография mayton
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Как бы простыми словами...

Вот у тебя в базе лежит 10 000 результатов опросов (survey) к примеру. Из них по ключу ты выберешь
допустим 5%. Почему 5? Я не знаю. Я просто так решил. Можешь взять 20% неважно.

Но я думаю что Хазел умеет срезать углы на поворотах и для подсчета штук сделат
ровно тот объем вычислений что надо. Но не будет процессить 100% сущностей.

Вот я так рассуждаю.
...
Рейтинг: 0 / 0
Stream и память
    #40126374
adminDontSleep
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
mayton
Как бы простыми словами...

Вот у тебя в базе лежит 10 000 результатов опросов (survey) к примеру. Из них по ключу ты выберешь
допустим 5%. Почему 5? Я не знаю. Я просто так решил. Можешь взять 20% неважно.

Но я думаю что Хазел умеет срезать углы на поворотах и для подсчета штук сделат
ровно тот объем вычислений что надо. Но не будет процессить 100% сущностей.

Вот я так рассуждаю.


ну я с тобой тут согласен - но мы все таки явно не выяснили как под капотом ведет себя стрим- может ( конечно нет,но всеже)
тут ворпос тоже ребром - кеш так же будет процессиить эту мапу,и так же тратить ресурсы свои на это и тут вопрос где будет оптимальней
так же мы в случае с хезель часть работы возложим на кеш часть вытащим в джава процесс - тоесть не все так однозначно как ты говоришь
...
Рейтинг: 0 / 0
Stream и память
    #40126379
Фотография mayton
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Померяй время отклика в двух случаях.
...
Рейтинг: 0 / 0
Stream и память
    #40126380
PetroNotC Sharp
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
mayton
Померяй время отклика в двух случаях.
вооооот)).
Без работы руками никак
...
Рейтинг: 0 / 0
Stream и память
    #40126419
Фотография mayton
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
PetroNotC Sharp
mayton
Померяй время отклика в двух случаях.
вооооот)).
Без работы руками никак

Он - странный. Я дал ссылку на доку - он говорит мы не выяснили как работает Stream.

Мне кажется что в будущих топиках надо взять за правило вообще ставить в игнор все
сомнения новичков. Пускай обосновывают свои сомнения фактами.

А то получается мы тут как ... психологи.
...
Рейтинг: 0 / 0
Stream и память
    #40126431
PetroNotC Sharp
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
mayton,
Какой новичок? Это же стас)))
...
Рейтинг: 0 / 0
Stream и память
    #40126542
Roman Osipov
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
В данном случае для подсчета оптимально использовать

https://docs.hazelcast.org/docs/4.0/javadoc/com/hazelcast/map/IMap.html#aggregate-com.hazelcast.aggregation.Aggregator-com.hazelcast.query.Predicate-

и в heap точно объекты не потянет, и скорость работы в десятки/сотни раз быстрее будет.
...
Рейтинг: 0 / 0
Stream и память
    #40126629
faustgreen
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Как я помню, цепочка стримов без терминальной операции всего лишь "план действия"
Код: java
1.
2.
3.
4.
5.
stream
.filter
.peak
.map
....


Само выполнение запускается одной из терминальных операций. После вызова терминальной операции элементы из "источника стрима" начинают дергаться по одному и проходить цепочку от начала до конца.
Если у нас цепочка состоит из методов на подобие
Код: java
1.
limit, skip, filter, ...


то никаких новых обектов в памяти не появиться (по идее).

Помять может начать расти, если:
1) В конце мы все собираем в коллекцию (собственно на размер коллекции).
2) Мы сами явно где то в цепочке создаем новые объекты. Причем, если их никуда не сохранять, (например, просто делаем вывод в консоль) то после "пролета цепочки" они будут доступны gs (т.е. память тоже не должна сильно страдать).
3) Если используется метод sort , так как в этом случае элементы не будут пролетать всю цепочку насквозь, а только до операции sort и после того как все элементы достигнут этой операции нижестоящая часть цепочки опять будет по одному дергать элементы (sort как бы становиться аналог источника стрима). Тут размер "новой" памяти - это размер структуры, в которой будут хранится элементы для сортировки.

P.s. Выше написанное не утверждение, а тема для обсуждения.
...
Рейтинг: 0 / 0
Stream и память
    #40126639
faustgreen
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Код: java
1.
2.
3.
4.
5.
6.
7.
 public long getSurveyResultInProgressCount(long surveyId) {
    return surveyResultIdentitiesPersistDelayedMap.keySet()
      .stream()
      .map(this::getCachedByIdentity)
      .filter(x -> x.getSurveyId() == surveyId)
      .count();
  }


1) метод count() запускает цепочку.
2) метод .map(this::getCachedByIdentity) получает из стрима первый элемент - ключ мапы и создает из него объект.
3) проверяется условие фильтра, если созданный объект проходит его, то ..
4) метод count() увеличивает счетчик на единицу.
5) созданный объект доступен для GC.
6) повторяются дейстия 2-5 для всех оставшихся элементов стрима.
...
Рейтинг: 0 / 0
Stream и память
    #40126643
PetroNotC Sharp
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
faustgreen,
п. 2 может не создавать а взять ранее созданный
...
Рейтинг: 0 / 0
Stream и память
    #40126647
PetroNotC Sharp
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
faustgreen
Как я помню, цепочка стримов без терминальной операции всего лишь "план действия"
Код: java
1.
2.
3.
4.
5.
stream
.filter
.peak
.map
....



Само выполнение запускается одной из терминальных операций. После вызова терминальной операции элементы из "источника стрима" начинают дергаться по одному и проходить цепочку от начала до конца.
Если у нас цепочка состоит из методов на подобие
Код: java
1.
limit, skip, filter, ...



то никаких новых обектов в памяти не появиться (по идее).

Помять может начать расти, если:
1) В конце мы все собираем в коллекцию (собственно на размер коллекции).
2) Мы сами явно где то в цепочке создаем новые объекты. Причем, если их никуда не сохранять, (например, просто делаем вывод в консоль) то после "пролета цепочки" они будут доступны gs (т.е. память тоже не должна сильно страдать).
3) Если используется метод sort , так как в этом случае элементы не будут пролетать всю цепочку насквозь, а только до операции sort и после того как все элементы достигнут этой операции нижестоящая часть цепочки опять будет по одному дергать элементы (sort как бы становиться аналог источника стрима). Тут размер "новой" памяти - это размер структуры, в которой будут хранится элементы для сортировки.

P.s. Выше написанное не утверждение, а тема для обсуждения.

4) зависит от кучи настроек ПО по кешированию которое перебирает стрим.
Это покрывает все п.п. c 1 по 3
...
Рейтинг: 0 / 0
Stream и память
    #40126650
PetroNotC Sharp
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
faustgreen,

Представь что он перебирает стримом фотографии fullhd 4k
...
Рейтинг: 0 / 0
Stream и память
    #40126665
faustgreen
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
PetroNotC Sharp

4) зависит от кучи настроек ПО по кешированию которое перебирает стрим.
Это покрывает все п.п. c 1 по 3

Скорее всего... Я стримы поверхностно знаю. Поэтому и написал, чтоб не рассматривали как утверждение.
...
Рейтинг: 0 / 0
Stream и память
    #40126677
PetroNotC Sharp
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
faustgreen,
Увы. Лучше обсуждать те темы, где чел находится возле компа.
Тут этого нет. Гадать можно что угодно.
...
Рейтинг: 0 / 0
Stream и память
    #40126743
adminDontSleep
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
faustgreen
Код: java
1.
2.
3.
4.
5.
6.
7.
 public long getSurveyResultInProgressCount(long surveyId) {
    return surveyResultIdentitiesPersistDelayedMap.keySet()
      .stream()
      .map(this::getCachedByIdentity)
      .filter(x -> x.getSurveyId() == surveyId)
      .count();
  }


1) метод count() запускает цепочку.
2) метод .map(this::getCachedByIdentity) получает из стрима первый элемент - ключ мапы и создает из него объект.
3) проверяется условие фильтра, если созданный объект проходит его, то ..
4) метод count() увеличивает счетчик на единицу.
5) созданный объект доступен для GC.
6) повторяются дейстия 2-5 для всех оставшихся элементов стрима.


примерно так и думал - единственно у меня сомнения на счет 5 пункта- ведь стрим оперирует не одиночными объектами ,а множеством- соотвественно до конца работы стрима стрим будет иметь ссылки на эти объекты в хипе и они не будут доступны для гц
...
Рейтинг: 0 / 0
Stream и память
    #40126745
Фотография mayton
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Есть такие шаблоны как Vizitor, Iterator.
...
Рейтинг: 0 / 0
Stream и память
    #40126756
Basil A. Sidorov
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
adminDontSleep
у меня сомнения на счет 5 пункта- ведь стрим оперирует не одиночными объектами ,а множеством
С чего это вдруг?
Если поток не предоставляет буферизации или/и произвольного доступа, то "в каждый момент времени" он "работает" с единственным объектом.
Если поток "проходит" какую-то коллекцию, то ссылки удерживает не он, а этот объект-коллекция. Т.е. не поток "виноват" в том, что (конкретный) объект нельзя убрать как мусор.
...
Рейтинг: 0 / 0
Stream и память
    #40126757
faustgreen
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
adminDontSleep
примерно так и думал - единственно у меня сомнения на счет 5 пункта- ведь стрим оперирует не одиночными объектами ,а множеством- соотвественно до конца работы стрима стрим будет иметь ссылки на эти объекты в хипе и они не будут доступны для гц

Вверху уже писали, что стрим это что то вроде цикла. Т.е. твой код
Код: java
1.
2.
3.
4.
5.
6.
7.
 public long getSurveyResultInProgressCount(long surveyId) {
    return surveyResultIdentitiesPersistDelayedMap.keySet()
      .stream()
      .map(this::getCachedByIdentity)
      .filter(x -> x.getSurveyId() == surveyId)
      .count();
  }


условно можно представить так:
Код: java
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
public long getSurveyResultInProgressCount(long surveyId) {
   int count = 0;
   for (int id : surveyResultIdentitiesPersistDelayedMap.keySet){
      SomeClass object = getCachedByIdentity(id);
       if (object.getSurveyId() == surveyId){
          count ++;
       }
    }
return count;
}


Т.е. для метода getSurveyResultInProgressCount переменная SomeClass object будет являться локальной,
и соответственно по выходу из метода ссылка на нее потеряется, как и на все другие локальные переменные.

Стрим то работает со множеством, но делает это с каждым элементом этого множества
по отдельности, сначала полностью обрабатываем один элемент, потом второй и т.д.
...
Рейтинг: 0 / 0
Stream и память
    #40126758
Фотография mayton
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Я это и предлагал в начале топика. Но здесь - смешались кони и люди. Автор поразительным
образом сделал "замес" из технологий Hazelcast и Java-технологий и сам себя запутал.

Вот надо разделять мух и котлет на будущее.
...
Рейтинг: 0 / 0
Stream и память
    #40126761
adminDontSleep
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
Basil A. Sidorov
adminDontSleep
у меня сомнения на счет 5 пункта- ведь стрим оперирует не одиночными объектами ,а множеством
С чего это вдруг?
Если поток не предоставляет буферизации или/и произвольного доступа, то "в каждый момент времени" он "работает" с единственным объектом.
Если поток "проходит" какую-то коллекцию, то ссылки удерживает не он, а этот объект-коллекция. Т.е. не поток "виноват" в том, что (конкретный) объект нельзя убрать как мусор.

вот видишь - ты слабо себе представляешь работу стрима и путаешь его с другими стримами- у них вообще нет ничего общего
в операции проежуточные они применяются не к элементам а с стриму ,они модифицируют стрим!!! а не элемент

некторые тут вообще путают стрим с цилклом - они похожи только по каким то субъективным понятиям - фатически между ними ничего общего

стрим вообще работает по принципу пул итераций

так что базиль пока не убедительно - я лично сомневаюсь что до заверщения работы стрим будет терять ссылки на эти объекты,тем самым давая дорогу ГЦ- конечно лучше всего провести какой то наглядый тест с профилировщиком
...
Рейтинг: 0 / 0
Stream и память
    #40126762
adminDontSleep
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
faustgreen

Т.е. для метода getSurveyResultInProgressCount переменная SomeClass object будет являться локальной,
и соответственно по выходу из метода ссылка на нее потеряется, как и на все другие локальные переменные.

Стрим то работает со множеством, но делает это с каждым элементом этого множества
по отдельности, сначала полностью обрабатываем один элемент, потом второй и т.д.


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

у нас же вопрос не в том,что будет по выходу из метода а в том,как будет вести себя память в процессе работы стрима!это очень важно

базиль утрвеждает что стрим будет обрабатывать поэлементно эти объеты и забывать про них- но это скорей всего не так
...
Рейтинг: 0 / 0
Stream и память
    #40126763
faustgreen
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
adminDontSleep, посмотри код выше , где представлен альтерантивный вариант метода через цикл for. Так примерно работает стрим внутри. Т.е. переменная object обновляется каждую итерацию цикла, ссылка на старый объект теряется.

А Basil A. Sidorov толковые вещи пишет, перечитай его последний пост.
...
Рейтинг: 0 / 0
Stream и память
    #40126764
faustgreen
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Посмотри еще доки официальные, там есть, например, вот это:

reduce

Код: java
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
T reduce(T identity, BinaryOperator<T> accumulator)

Performs a reduction on the elements of this stream, using the provided identity value
 and an associative accumulation function, and returns the reduced value. 
This is equivalent to:

T result = identity;
for (T element : this stream)
   result = accumulator.apply(result, element)
return result;
...
Рейтинг: 0 / 0
Stream и память
    #40126765
faustgreen
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Т.е. по факту реализация метода reduce - это цикл.
Теперь возми вот этот код:
Код: java
1.
2.
3.
4.
T result = identity;
for (T element : this stream)
   result = accumulator.apply(result, element)
return result;


и выполни его для 1000 элементов. Сколько у тебя в этом случае создасться объектов в памяти,
на которые будет удерживаться ссылка?
...
Рейтинг: 0 / 0
Stream и память
    #40126766
faustgreen
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
adminDontSleep
так что базиль пока не убедительно - я лично сомневаюсь что до заверщения работы стрим будет терять ссылки на эти объекты,тем самым давая дорогу ГЦ- конечно лучше всего провести какой то наглядый тест с профилировщиком

Вот тест:
1) Этот код будет работать бесконечно:
Код: java
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
14.
package test;

import java.util.stream.Stream;

public class Test {
	public static void main(String[] args) {
		Stream<Integer> infiniteStream = Stream.iterate(0, i -> i);

		infiniteStream
		  .map(e->String.valueOf(e))
		  .forEach(System.out::println);
		
	}
}



2) Этот код выдаст Exception in thread "main" java.lang.OutOfMemoryError: Java heap space:
Код: java
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
14.
15.
package test;

import java.util.stream.Stream;

public class Test {
	public static void main(String[] args) {
		Stream<Integer> infiniteStream = Stream.iterate(0, i -> i);

		infiniteStream
		  .map(e->String.valueOf(e))
                  .sorted()
		  .forEach(System.out::println);
		
	}
}

...
Рейтинг: 0 / 0
Stream и память
    #40126767
faustgreen
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
В первом примере все элементы бесконечного стрима "пролетают насквозь" нашу цепочку методов стрима. Создается бесконечное количество строк "0", но они каждую итерацию присваиваются одной и той же переменной.

Во втором случае создается бесконечное количество строк "0", которые накапливаются в методе sorted() и не проходят дальше (накапливаются в памяти).
...
Рейтинг: 0 / 0
Stream и память
    #40126769
Basil A. Sidorov
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
adminDontSleep
вот видишь - ты слабо себе представляешь работу стрима
Зато вы, как я погляжу, погрузились в Stream API и детали реализации.и путаешь его с другими стримами- у них вообще нет ничего общегоИ на чём основано ваше категоричное утверждение?в операции проежуточные они применяются не к элементам а с стриму ,они модифицируют стрим!!! а не элементИ?
Допустим, что это факт, а не ваша вольная интерпретация. Как из этого факта следует, что объект-поток удерживает от сборки мусора те элементы, которые он "потрогал"?

P.S.
Я в курсе, что конкретные промежуточные операции (например - сортировка) будут "удерживать" весь сортируемый набор, но другим промежуточным операциям (например - счётчик) это совсем не требуется.
...
Рейтинг: 0 / 0
Stream и память
    #40126787
PetroNotC Sharp
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
adminDontSleep
у нас же вопрос не в том,что будет по выходу из метода а в том,как будет вести себя память в процессе работы стрима!это очень важно
тебе осталось написать
покажиПамять() до и после вызова метода.
Разве не очевидно?
Код: java
1.
2.
3.
4.
5.
6.
7.
public long getSurveyResultInProgressCount(long surveyId) {
    return surveyResultIdentitiesPersistDelayedMap.keySet()
      .stream()
      .map(this::getCachedByIdentity)
      .filter(x -> x.getSurveyId() == surveyId)
      .count();
  }


А как память внутри метода зачем тебе?
...
Рейтинг: 0 / 0
Stream и память
    #40126808
PetroNotC Sharp
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
adminDontSleep
это очень важно

простейшая логика и здравый смысл говорят обратное.
Без профилирования в целом метода нельзя копаться внутри метода.
Если конечно твоя цель не просто поболтать бесцельно.
С другой стороны, бросив три фразы выше кто их обосновывать будет?
22421401
...
Рейтинг: 0 / 0
Stream и память
    #40126830
PetroNotC Sharp
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
faustgreen
adminDontSleep
так что базиль пока не убедительно - я лично сомневаюсь что до заверщения работы стрим будет терять ссылки на эти объекты,тем самым давая дорогу ГЦ- конечно лучше всего провести какой то наглядый тест с профилировщиком

Вот тест:
1) Этот код будет работать бесконечно:
Код: java
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
14.
package test;

import java.util.stream.Stream;

public class Test {
	public static void main(String[] args) {
		Stream<Integer> infiniteStream = Stream.iterate(0, i -> i);

		infiniteStream
		  .map(e->String.valueOf(e))
		  .forEach(System.out::println);
		
	}
}




2) Этот код выдаст Exception in thread "main" java.lang.OutOfMemoryError: Java heap space:
Код: java
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
14.
15.
package test;

import java.util.stream.Stream;

public class Test {
	public static void main(String[] args) {
		Stream<Integer> infiniteStream = Stream.iterate(0, i -> i);

		infiniteStream
		  .map(e->String.valueOf(e))
                  .sorted()
		  .forEach(System.out::println);
		
	}
}



отличный пример мембер. ТС'у учится "меньше слов и больше кода"
В общем случае стрим это конвейерные операции. Память выделяется для самой коллекции проходящей через стрим или ВООБЩЕ не выделяется при обработке из сети.
...
Рейтинг: 0 / 0
Stream и память
    #40126837
Leonid Kudryavtsev
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
PetroNotC Sharp
....или ВООБЩЕ не выделяется при обработке из сети.

это как?
...
Рейтинг: 0 / 0
Stream и память
    #40126839
PetroNotC Sharp
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Leonid Kudryavtsev,
а)
- создание коллекции для стрима - выделяем память ДЛЯ КОЛЛЕКЦИИ
- обработка стримом без выделения памяти
б)
- есть канал из сети = память не выделяется
- обработка стримом без выделения памяти
?
...
Рейтинг: 0 / 0
Stream и память
    #40126842
PetroNotC Sharp
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Leonid Kudryavtsev,
аналогия - SAX и DOM парсер XML
...
Рейтинг: 0 / 0
Stream и память
    #40126844
Leonid Kudryavtsev
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
PetroNotC Sharp

...
б)
- есть канал из сети = память не выделяется
...

Что же это за сеть такая (на IBM PC и их клонах), что не требует локальной копии обрабатываемого объекта?

p.s. AFAIK конечно есть сетевые карты с такой возможностью (Infiniband или сильно продвинутые 10 G), но вот их поддержки Java'ой - я лично не помню
...
Рейтинг: 0 / 0
Stream и память
    #40126846
PetroNotC Sharp
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Leonid Kudryavtsev,
вы наверно говорите о частностях.
Есть коллекция из млн объектов. А не объект один.
Именно это автора пугает.
Конечно один объект по приходу создается.
Суть что миллион не надо.
И вообще, стрим не для "не требует локальной копии обрабатываемого объекта"
Он для потока информации. Например видео поток.
Ключевое слово поток.
...
Рейтинг: 0 / 0
Stream и память
    #40126849
PetroNotC Sharp
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Leonid Kudryavtsev,
многие пишут что for на 30 проц быстрее стрима.
Так что вопрос в том что тут экономит автор))
Он не борется с задачей. А изучает стримы за наш счет)
...
Рейтинг: 0 / 0
Stream и память
    #40126880
Leonid Kudryavtsev
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
PetroNotC Sharp

многие пишут что for на 30 проц быстрее стрима.

"не верю" ( C )
то, что знаю (профилировал) я:
1. при правильном использовании с ListArray стрим совершенно аналогичен for
2. при НЕправильном использовании с ListArray (что очень легко) стрим значительно (раза в 3-4, а может и больше) медленнее for'а.

При п.2., не срабатывает Jit оптимизация проверки выхода за пределы массива (при использовании с ListArray).
...
Рейтинг: 0 / 0
Stream и память
    #40126891
PetroNotC Sharp
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Leonid Kudryavtsev,
Там особый юзкейс был. Посмотрю позже.
...
Рейтинг: 0 / 0
Stream и память
    #40126912
adminDontSleep
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
faustgreen
Посмотри еще доки официальные, там есть, например, вот это:

reduce

Код: java
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
T reduce(T identity, BinaryOperator<T> accumulator)

Performs a reduction on the elements of this stream, using the provided identity value
 and an associative accumulation function, and returns the reduced value. 
This is equivalent to:

T result = identity;
for (T element : this stream)
   result = accumulator.apply(result, element)
return result;



фауст ты путаешь англ пеервод еквивалетно не значит что реализация ( а стало быть и сайд эфекты на память ) будут одинаковые- хотя внешне выглядит одианоково

копни глубже про стримы и их взамодействие с памятью -вот эта реализация обратных пул итераций например
...
Рейтинг: 0 / 0
Stream и память
    #40126913
adminDontSleep
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
Basil A. Sidorov

P.S.
Я в курсе, что конкретные промежуточные операции (например - сортировка) будут "удерживать" весь сортируемый набор, но другим промежуточным операциям (например - счётчик) это совсем не требуется.

теперь ты гораздо ближе к истине ,но count() это терминальная операция - она возвращает число а не стрим,как промежуточные - разберись с этим и станет более понянет мой вопрос изначальный
...
Рейтинг: 0 / 0
Stream и память
    #40126915
adminDontSleep
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
Roman Osipov
В данном случае для подсчета оптимально использовать

https://docs.hazelcast.org/docs/4.0/javadoc/com/hazelcast/map/IMap.html#aggregate-com.hazelcast.aggregation.Aggregator-com.hazelcast.query.Predicate-

и в heap точно объекты не потянет, и скорость работы в десятки/сотни раз быстрее будет.

согласен
...
Рейтинг: 0 / 0
Stream и память
    #40126924
adminDontSleep
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
вообщем провел тест

Код: java
1.
2.
3.
4.
5.
6.
7.
8.
9.
       LongStream intStream = LongStream.range(0, Long.MAX_VALUE);

        var sum = intStream
                .boxed()
                .map(Employee::new)
                .filter(x -> x.getId() % 2 == 0)
                .count();

        System.out.println(sum);



гц работает гребенкой ,утечки памяти нет ,гц работает - но надо отметить что хип забивается целиком ,тоесть как я выше и писал не все так просто и однозначно
второй тест был с forEach()

там ожидаемо стрим работал более похоже на цикл

это forEach()
...
Рейтинг: 0 / 0
Stream и память
    #40126925
adminDontSleep
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
а это count()
...
Рейтинг: 0 / 0
Stream и память
    #40126926
adminDontSleep
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
faustgreen
В первом примере все элементы бесконечного стрима "пролетают насквозь" нашу цепочку методов стрима. Создается бесконечное количество строк "0", но они каждую итерацию присваиваются одной и той же переменной.

Во втором случае создается бесконечное количество строк "0", которые накапливаются в методе sorted() и не проходят дальше (накапливаются в памяти).

в своих примерах ты по незнанию работы стримов либо лукавишь ,либо просто ошибаешься- вверху две картинки,которые разрушают твою теорию - о поэлементной обработке
- она поэлемента если у тебя териманалка поэлемента
- если терминалка подразумевают некую буферизацию - ты проиграл
поэтому твои тесты и не корректны и не отражают реальной картины происходящего
...
Рейтинг: 0 / 0
Stream и память
    #40126928
adminDontSleep
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
класс Employee

Код: java
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
public class Employee {

    private Long id;

    public Employee(Long id) {
        this.id = id;

    }

    public Long getId() {
        return id;
    }
}



тесты проводились на этом коде

терминальная оперцая forEach

Код: java
1.
2.
3.
4.
5.
6.
7.
       LongStream intStream = LongStream.range(0, Long.MAX_VALUE);

         intStream
                .boxed()
                .map(Employee::new)
                .filter(x -> x.getId() % 2 == 0)
                .forEach(System.out::println);



терминальная операция count()

Код: java
1.
2.
3.
4.
5.
6.
7.
8.
9.
      LongStream intStream = LongStream.range(0, Long.MAX_VALUE);

        var sum = intStream
                .boxed()
                .map(Employee::new)
                .filter(x -> x.getId() % 2 == 0)
                .count();

        System.out.println(sum);
...
Рейтинг: 0 / 0
Stream и память
    #40126933
adminDontSleep
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
PetroNotC Sharp

Так что вопрос в том что тут экономит автор))
count(
картинка выше - простейший объект с одним полем- 1 гиг хипа на count()
а теперь представь таких потоков будут сотни- понятно что балнсер скинет куда надо - но вот нужно ли лишние ноды нам или проще в хезеле обработать- все думают что хезель это что там такое бесплатное- но нет - теже самые ноды

ну и да я пытаюсь везде экономить и бороться за максимальную производительность
у меня например instaceOf ревью не пройдет
...
Рейтинг: 0 / 0
Stream и память
    #40126943
SpringMan
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
adminDontSleep,

Без обид, но ты меряешь какую-то фигню и делаешь такие же выводы. На обоих графиках used heap size падает до нуля - это значит, что нет там никакой буферизации. Память растет до гига, потому что у тебя идет генерация кучи Employee, и очищаются они тогда, когда jvm посчитает, что ей нужно свободное место. Поставь -Xmx на 50 мб и никакого гига никто тратить не будет.

В твоем первоначальном примере, есть или нет утечки зависят только от двух мест:
1) Какая имплементация у surveyResultIdentitiesPersistDelayedMap(), если тут стандартные джавовые HashMap/TreeMap и т.д., то никаких буферизаций не будет (о чем тебе толдычат уже 4ую страницу). Если что-то другое, то надо смотреть какой стрим они возвращают (опять же обычно библиотечный код пишут не совсем идиоты, и вряд ли они будут что-то буферизировать без надобности)
2) Что находится в this::getCachedByIdentity, если этот кэш в хипе, то само сабой он будет расти. Но к стримам это имеет весьма далекое отношение

На чьей стороне лучше делать, это скорее вопрос к hezelcast-у, а не каким-то утечкам на стримах
...
Рейтинг: 0 / 0
Stream и память
    #40126946
faustgreen
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
adminDontSleep

Копни глубже про стримы и их взамодействие с памятью -вот эта реализация обратных пул итераций например

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


Ну я про это и писал выше, да и не только я. Понятно, что если цепочка у тебя заканчивается сбором всего в коллекцию, то у тебя будет забиваться память, но это потому, что ты в памяти держишь коллекцию и добавляешь в нее элементы. Тоже самое и с методом sort и ему подобными, как я понимаю внитру у него создается какая то структура данных для хранения элементов для сортировки.
Стримы они ж вроде как не имеют состояния - это просто методы, которые вызываются, но методы внутри себя могут создавать объекты на время своей работы. А размер этих объектов зависит от реализации самих методоы стрима, а также от реализации функций, которые мы в эти методы передаем.

Еще раз напишу, я стримы глубоко не знаю, просто когда с ними возился, и сложилось такое виденье. Где то могу ошибаться.
...
Рейтинг: 0 / 0
Stream и память
    #40126952
adminDontSleep
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
SpringMan
adminDontSleep,

Без обид, но ты меряешь какую-то фигню и делаешь такие же выводы. На обоих графиках used heap size падает до нуля - это значит, что нет там никакой буферизации. Память растет до гига, потому что у тебя идет генерация кучи Employee, и очищаются они тогда, когда jvm посчитает, что ей нужно свободное место. Поставь -Xmx на 50 мб и никакого гига никто тратить не будет.

В твоем первоначальном примере, есть или нет утечки зависят только от двух мест:
1) Какая имплементация у surveyResultIdentitiesPersistDelayedMap(), если тут стандартные джавовые HashMap/TreeMap и т.д., то никаких буферизаций не будет (о чем тебе толдычат уже 4ую страницу). Если что-то другое, то надо смотреть какой стрим они возвращают (опять же обычно библиотечный код пишут не совсем идиоты, и вряд ли они будут что-то буферизировать без надобности)
2) Что находится в this::getCachedByIdentity, если этот кэш в хипе, то само сабой он будет расти. Но к стримам это имеет весьма далекое отношение

На чьей стороне лучше делать, это скорее вопрос к hezelcast-у, а не каким-то утечкам на стримах

да какие обиды если ты сделал выводы не удосужившись почитать последние посты- я привел два графика с одним и тем же стримом но разными терминальными операциями - чтобы доказать местным снобам- что память жвм имеет немного иное представление - чем они тут пишут
...
Рейтинг: 0 / 0
Stream и память
    #40126954
adminDontSleep
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
faustgreen
adminDontSleep
в своих примерах ты по незнанию работы стримов либо лукавишь ,либо просто ошибаешься- вверху две картинки,которые разрушают твою теорию - о поэлементной обработке
- она поэлемента если у тебя териманалка поэлемента
- если терминалка подразумевают некую буферизацию - ты проиграл
поэтому твои тесты и не корректны и не отражают реальной картины происходящего


Ну я про это и писал выше, да и не только я. Понятно, что если цепочка у тебя заканчивается сбором всего в коллекцию, то у тебя будет забиваться память, но это потому, что ты в памяти держишь коллекцию и добавляешь в нее элементы. Тоже самое и с методом sort и ему подобными, как я понимаю внитру у него создается какая то структура данных для хранения элементов для сортировки.
Стримы они ж вроде как не имеют состояния - это просто методы, которые вызываются, но методы внутри себя могут создавать объекты на время своей работы. А размер этих объектов зависит от реализации самих методоы стрима, а также от реализации функций, которые мы в эти методы передаем.

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

ты много где верно говоришь но ошибаешься в одном 0 стримы имеют состояние- тоесть применяя какую то промежуточную операцию ты меняешь состояние стрима ЦЕЛИКОМ!!! а не его элементы

при этом после этого ты уже не можешь вызывать состояние стрима которое было до этой операции
...
Рейтинг: 0 / 0
Stream и память
    #40126955
adminDontSleep
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
faustgreen
adminDontSleep

Копни глубже про стримы и их взамодействие с памятью -вот эта реализация обратных пул итераций например

Что такое обратные пул итерации? Сбрось ссылку, если есть под рукой.

это основы работы стрима

стрим работает от термианльной операции в отличии от любых циклов
тоесть работа стрима начинается с терминалки и именно поэтому у тебя не забился хип- ты применял терминалку к каждому элементу стрима - потоэтму гц спокойно собирал нулевые ссылки
как я тебе выше показал даже count() показывает абсолютно другое состоняние памяти
...
Рейтинг: 0 / 0
Stream и память
    #40126960
SpringMan
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
adminDontSleep

да какие обиды если ты сделал выводы не удосужившись почитать последние посты- я привел два графика с одним и тем же стримом но разными терминальными операциями - чтобы доказать местным снобам- что память жвм имеет немного иное представление - чем они тут пишут

К сожалению я прочитал эти посты, и повторю еще раз - и графики и выводы полная фигня. Ты можешь еще раз конкретно написать два предложение: первое - что сказали местные снобы, второе - в чем они не правы. Конкретно какое представление говорят они и какое верное?
У тебя графики за разные интервалы времени, не выставлен xmx, внутри forEach стоит System.out::println - хотя бы из-за этого твои картинки не имеют никакого смысла. После того как ты это исправишь, еще можешь рассказать как эти графики объясняют что-то про буферизацию/утечки/по элементные обработки - вот это будет самое интересное и смешное
...
Рейтинг: 0 / 0
Stream и память
    #40126965
Фотография mayton
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
adminDontSleep

гц работает гребенкой ,утечки памяти нет ,гц работает - но надо отметить что хип забивается целиком ,тоесть как я выше и писал не все так просто и однозначно

Расскажи как ты себе понимаешь "утечку памяти".
...
Рейтинг: 0 / 0
Stream и память
    #40126971
faustgreen
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
adminDontSleep
ну и да я пытаюсь везде экономить и бороться за максимальную производительность
у меня например instaceOf ревью не пройдет

Тут пишут, что особых проблем с instanceOf нет.
...
Рейтинг: 0 / 0
Stream и память
    #40126994
Basil A. Sidorov
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
adminDontSleep
теперь ты гораздо ближе к истине ,но count() это терминальная операция
Замените условный count на условный filter, но ваши вольные интерпретации так и останутся вольными интерпретациями.

P.S.
Я даже больше скажу - сборщик мусора не обязан начинать работу, когда накоплен условный гигабайт мусора, но свободно ещё условных десять гигабайт для кучи.
...
Рейтинг: 0 / 0
Stream и память
    #40127025
PetroNotC Sharp
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
SpringMan
Ты можешь еще раз конкретно написать два предложение: первое - что сказали местные снобы, второе - в чем они не правы. Конкретно какое представление говорят они и какое верное?
+1
Как сказал бы препод ВУЗа: "в чем предмет спора?"
...
Рейтинг: 0 / 0
Stream и память
    #40127050
adminDontSleep
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
mayton
adminDontSleep

гц работает гребенкой ,утечки памяти нет ,гц работает - но надо отметить что хип забивается целиком ,тоесть как я выше и писал не все так просто и однозначно

Расскажи как ты себе понимаешь "утечку памяти".

утечка памяти это нарастание хипа + нет очистики от ГЦ - что указывает ,что на объкты в куче все еще есть ссылки
...
Рейтинг: 0 / 0
Stream и память
    #40127052
adminDontSleep
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
faustgreen
adminDontSleep
ну и да я пытаюсь везде экономить и бороться за максимальную производительность
у меня например instaceOf ревью не пройдет

Тут пишут, что особых проблем с instanceOf нет.

давно ли стак стал истиной в последней инстанции?
запомни если у тебя в ООП модели где то закрался instanceOf ты уже проиграл эту битву- почему - попытайся понять сам
...
Рейтинг: 0 / 0
Stream и память
    #40127058
adminDontSleep
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
Basil A. Sidorov
adminDontSleep
теперь ты гораздо ближе к истине ,но count() это терминальная операция
Замените условный count на условный filter, но ваши вольные интерпретации так и останутся вольными интерпретациями.

P.S.
Я даже больше скажу - сборщик мусора не обязан начинать работу, когда накоплен условный гигабайт мусора, но свободно ещё условных десять гигабайт для кучи.

я тебе привел один и тот же стрим с разными терминалками и ты все равно как упертый продолжаешь твердить одно и тоже- очвеидно что count() вызывает распухание в два раза большее ,чем поэлементная терминалка- о чем это говорит додумай сам
но ладно я тебе помогу - я уменьшил хип немного ,запустил в два потока и на count() словил OOM
теже вводные но мерминалка forEach () - OOM не произошло

дальше будешь спорить?
тоесть очевидно что ты явно не понимаешь как работают терминалки и стримы
...
Рейтинг: 0 / 0
Stream и память
    #40127059
adminDontSleep
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
SpringMan
adminDontSleep

да какие обиды если ты сделал выводы не удосужившись почитать последние посты- я привел два графика с одним и тем же стримом но разными терминальными операциями - чтобы доказать местным снобам- что память жвм имеет немного иное представление - чем они тут пишут

К сожалению я прочитал эти посты, и повторю еще раз - и графики и выводы полная фигня. Ты можешь еще раз конкретно написать два предложение: первое - что сказали местные снобы, второе - в чем они не правы. Конкретно какое представление говорят они и какое верное?
У тебя графики за разные интервалы времени, не выставлен xmx, внутри forEach стоит System.out::println - хотя бы из-за этого твои картинки не имеют никакого смысла. После того как ты это исправишь, еще можешь рассказать как эти графики объясняют что-то про буферизацию/утечки/по элементные обработки - вот это будет самое интересное и смешное

хорошая попытка ,но нет,ты проиграл даже не попытавшись)
для тебя поясню еще раз абсолютно одинаковый код с разницей лишь в терминальной операции
поведение памяти ИНОЕ! там явно нет поэлеменнтых операций ,как утверждает фауст и базиль- там идет pull iteration и это явно прослеживается на графиках
собственно можно очень просто проверить - уменьшить хип и посмотреть будет ли OOM,если обработка стрима будет поэлементая - то мы никогда не получим ООМ,и мы таки получим ООМ если гц по не сможет убирать объекты
собственно я это и воспроизвел- на терминальке count() получил out of memory - казалось бы почему? ведь вы товарищи утверждаете ,что элемент стрима - обработан и вуаля - его можно убирать гц)
...
Рейтинг: 0 / 0
Stream и память
    #40127061
adminDontSleep
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
Basil A. Sidorov
adminDontSleep
теперь ты гораздо ближе к истине ,но count() это терминальная операция
Замените условный count на условный filter, но ваши вольные интерпретации так и останутся вольными интерпретациями.

P.S.
Я даже больше скажу - сборщик мусора не обязан начинать работу, когда накоплен условный гигабайт мусора, но свободно ещё условных десять гигабайт для кучи.

а что ты скажешь на ООМ?))
где то неувязка в твоей теории...
...
Рейтинг: 0 / 0
Stream и память
    #40127062
SpringMan
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
adminDontSleep

хорошая попытка ,но нет,ты проиграл даже не попытавшись)
для тебя поясню еще раз абсолютно одинаковый код с разницей лишь в терминальной операции
поведение памяти ИНОЕ!

Ты говоришь абстрактное ИНОЕ потому что не можешь сказать что-то конкретное без общих фраз или что?
adminDontSleep

собственно я это и воспроизвел- на терминальке count() получил out of memory - казалось бы почему? ведь вы товарищи утверждаете ,что элемент стрима - обработан и вуаля - его можно убирать гц)

Ради тебя взял твой пример, на который ты ссылаешься:
Код: 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.
package tst;

import java.util.stream.LongStream;

public class StreamPsvm {
    public static class Employee {
        private Long id;

        public Employee(Long id) {
            this.id = id;
        }

        public Long getId() {
            return id;
        }
    }

    public static void main(String[] args) {
        var sum = LongStream.range(0, Long.MAX_VALUE)
                .boxed()
                .map(Employee::new)
                .filter(x -> x.getId() % 2 == 0)
                .count();
        System.out.println(sum);
    }
}


Работает спокойно на -Xmx10M и никаких ООМ. Так что можешь не врать или показать свой пример запуска
...
Рейтинг: 0 / 0
Stream и память
    #40127071
adminDontSleep
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
SpringMan
adminDontSleep

хорошая попытка ,но нет,ты проиграл даже не попытавшись)
для тебя поясню еще раз абсолютно одинаковый код с разницей лишь в терминальной операции
поведение памяти ИНОЕ!

Ты говоришь абстрактное ИНОЕ потому что не можешь сказать что-то конкретное без общих фраз или что?
adminDontSleep

собственно я это и воспроизвел- на терминальке count() получил out of memory - казалось бы почему? ведь вы товарищи утверждаете ,что элемент стрима - обработан и вуаля - его можно убирать гц)

Ради тебя взял твой пример, на который ты ссылаешься:
Код: 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.
package tst;

import java.util.stream.LongStream;

public class StreamPsvm {
    public static class Employee {
        private Long id;

        public Employee(Long id) {
            this.id = id;
        }

        public Long getId() {
            return id;
        }
    }

    public static void main(String[] args) {
        var sum = LongStream.range(0, Long.MAX_VALUE)
                .boxed()
                .map(Employee::new)
                .filter(x -> x.getId() % 2 == 0)
                .count();
        System.out.println(sum);
    }
}


Работает спокойно на -Xmx10M и никаких ООМ. Так что можешь не врать или показать свой пример запуска

где доказательства работы?просто пук в небо тут не пройдет- видео с параметрами запуска пожалуйста
...
Рейтинг: 0 / 0
Stream и память
    #40127077
SpringMan
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
adminDontSleep,
Все для тебя друг: https://drive.google.com/file/d/1KSX1EIaaY7Ta-OONk-K-yze5Pp5XBPiw/view?usp=sharing - только вначале скачай, а то онлайн не быстро воспроизводится.
Ну и в ответ покажи свое видео, всегде мечтал увидеть чудо, а тут такой случай попался. Давай хотя бы чтобы на мегабайт 200 упало с ООМ
...
Рейтинг: 0 / 0
Stream и память
    #40127084
adminDontSleep
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
SpringMan
adminDontSleep,
Все для тебя друг: https://drive.google.com/file/d/1KSX1EIaaY7Ta-OONk-K-yze5Pp5XBPiw/view?usp=sharing - только вначале скачай, а то онлайн не быстро воспроизводится.
Ну и в ответ покажи свое видео, всегде мечтал увидеть чудо, а тут такой случай попался. Давай хотя бы чтобы на мегабайт 200 упало с ООМ

сделал так же -OOM нет-причем я запускал это в 4х потоках
тогда сорян- но у меня реально на тесте выскочил ООМ в прошлый раз причем xmx был 512 вроде

может изза друих процессов на компе ( я смотрел видос на ютубе) не хватило для гц и он не успел очистить

но признаю свою неправоту- видно что нет никаких проблем и гц все чистит- значит никакой буферизации у count() нет
причем не возниакиет проблем если этот код пустить в 4+ потоках - картина не меняется ,за исключениемм активновсти ГЦ

ну собвственно это я и хотел выяснить
...
Рейтинг: 0 / 0
Stream и память
    #40127089
Фотография mayton
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
adminDontSleep
mayton
пропущено...

Расскажи как ты себе понимаешь "утечку памяти".

утечка памяти это нарастание хипа + нет очистики от ГЦ - что указывает ,что на объкты в куче все еще есть ссылки

Верно. И разве у тебя есть такая проблема? По моему - нет.
...
Рейтинг: 0 / 0
Stream и память
    #40127090
adminDontSleep
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
mayton
adminDontSleep
пропущено...

утечка памяти это нарастание хипа + нет очистики от ГЦ - что указывает ,что на объкты в куче все еще есть ссылки

Верно. И разве у тебя есть такая проблема? По моему - нет.

ну я ее словил - надо вопроизвести как
но фактичеки выставив 10 м хипа я вижу что все оюъекты создаваемые успешно удаляются

меня изначально смутил тот факт что две разные теримнальные операции почему то в памяти выглядят по разному

я для себя предположил что count() применяется как батч- тоесть не поэлеменнто а некими пачками - посему в хипе некоторое время удреживается часть объектов и это бы было проблемой - так как если будет условно много потоков - то хип ляжет по ООМ- но такого не произошло - на мое удивление и это говорит о том,что мы не почувсвуем этот канут - если будем считать его в дажва процессе а не в хезель касте
...
Рейтинг: 0 / 0
Stream и память
    #40127091
Фотография mayton
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
adminDontSleep
mayton
пропущено...

Верно. И разве у тебя есть такая проблема? По моему - нет.

ну я ее словил - надо вопроизвести как
но фактичеки выставив 10 м хипа я вижу что все оюъекты создаваемые успешно удаляются

меня изначально смутил тот факт что две разные теримнальные операции почему то в памяти выглядят по разному

я для себя предположил что count() применяется как батч- тоесть не поэлеменнто а некими пачками - посему в хипе некоторое время удреживается часть объектов и это бы было проблемой - так как если будет условно много потоков - то хип ляжет по ООМ- но такого не произошло - на мое удивление и это говорит о том,что мы не почувсвуем этот канут - если будем считать его в дажва процессе а не в хезель касте

Ничего ты там не словил. Вот когда будет OutOfMemoryException - тогда и занимайся.
На графиках наблюдается обычная активность средное-статичтического java-приложения.
...
Рейтинг: 0 / 0
Stream и память
    #40127092
PetroNotC Sharp
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
adminDontSleep
но признаю свою неправоту- видно что нет никаких проблем и гц все чистит
дык с первой страницы говорили.
Начинай с кода а не с говорильни и все будет ОК
...
Рейтинг: 0 / 0
Stream и память
    #40127093
SpringMan
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
adminDontSleep
что мы не почувсвуем этот канут - если будем считать его в дажва процессе а не в хезель касте

Обычно расчет идет на уровне БД, чтобы не пересылать по сети миллионы строк в java приложение - и обычно профит идет из-за этого. Где идет инкремент это уже мелочи на фоне затрат на сетевое взаимодействие
...
Рейтинг: 0 / 0
Stream и память
    #40127639
adminDontSleep
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
SpringMan
adminDontSleep
что мы не почувсвуем этот канут - если будем считать его в дажва процессе а не в хезель касте

Обычно расчет идет на уровне БД, чтобы не пересылать по сети миллионы строк в java приложение - и обычно профит идет из-за этого. Где идет инкремент это уже мелочи на фоне затрат на сетевое взаимодействие

у нас в качестве бд пострегрс - и есть такой кейс где клиент очень плотно работает с данными - тоесть они где то в течении 10 -15 минут постоянно обновляются и выдаются клиенту- и бд ставноится бутылочным горлышком - и как нельзя лучше тут подошел хезель ,который процессит эту дату с временным гепом небольшим по истечении времени это все записывается в бд

все это хорошо ложится на много нод,так как хезель все это поддерживает

поэтому считать каунт в даннм конкретном случае мы из бд не можем - ибо в бд еще ничего не записано

почему уточнил что постгрес- потому что таже монго этот кейс отрабатывает без каких либо проблем
...
Рейтинг: 0 / 0
Stream и память
    #40127640
adminDontSleep
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
mayton

Ничего ты там не словил. Вот когда будет OutOfMemoryException - тогда и занимайся.
На графиках наблюдается обычная активность средное-статичтического java-приложения.

я словил но без профайлера к сожалению, реально был OOM на count() и xmx был 512 старт с 256 на нескольких потоках выбил ООМ
причем это же тест объекты - чут толже Long ,в реальности там достаточно увесистые объекты и именно поэтому не хочется тащить это все в хип уповая на гц- да почистит - как мы выяснили - но при этом по графикам даже лайт объектов гц активность начинает уверернно кушат процессрное время
...
Рейтинг: 0 / 0
Stream и память
    #40127649
PetroNotC Sharp
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
adminDontSleep
я словил
ссылку дай где словил.
Поэтому и 5 страниц топика.
...
Рейтинг: 0 / 0
Stream и память
    #40127699
Фотография mayton
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
adminDontSleep
mayton

Ничего ты там не словил. Вот когда будет OutOfMemoryException - тогда и занимайся.
На графиках наблюдается обычная активность средное-статичтического java-приложения.

я словил но без профайлера к сожалению, реально был OOM на count() и xmx был 512 старт с 256 на нескольких потоках выбил ООМ
причем это же тест объекты - чут толже Long ,в реальности там достаточно увесистые объекты и именно поэтому не хочется тащить это все в хип уповая на гц- да почистит - как мы выяснили - но при этом по графикам даже лайт объектов гц активность начинает уверернно кушат процессрное время

Запускай приложение с ключами

Код: java
1.
java -XX:+HeapDumpOnOutOfMemoryError -XX:HeapDumpPath=/some/path ....



Воспроизводи ошибку снова. Прикладывай файл. Или если знаешь что делать - покажи какие там объекты
по количеству штук и по памяти (deep size).
...
Рейтинг: 0 / 0
Stream и память
    #40127820
adminDontSleep
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
mayton
adminDontSleep
пропущено...

я словил но без профайлера к сожалению, реально был OOM на count() и xmx был 512 старт с 256 на нескольких потоках выбил ООМ
причем это же тест объекты - чут толже Long ,в реальности там достаточно увесистые объекты и именно поэтому не хочется тащить это все в хип уповая на гц- да почистит - как мы выяснили - но при этом по графикам даже лайт объектов гц активность начинает уверернно кушат процессрное время

Запускай приложение с ключами

Код: java
1.
java -XX:+HeapDumpOnOutOfMemoryError -XX:HeapDumpPath=/some/path ....



Воспроизводи ошибку снова. Прикладывай файл. Или если знаешь что делать - покажи какие там объекты
по количеству штук и по памяти (deep size).

на выходных погоняю ,сейчас работы много- но там помоему было что то около 19 млн Employee и где то столько же Long
...
Рейтинг: 0 / 0
Stream и память
    #40127840
lleming
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
adminDontSleep
mayton

Ничего ты там не словил. Вот когда будет OutOfMemoryException - тогда и занимайся.
На графиках наблюдается обычная активность средное-статичтического java-приложения.

я словил но без профайлера к сожалению, реально был OOM на count() и xmx был 512 старт с 256 на нескольких потоках выбил ООМ
причем это же тест объекты - чут толже Long ,в реальности там достаточно увесистые объекты и именно поэтому не хочется тащить это все в хип уповая на гц- да почистит - как мы выяснили - но при этом по графикам даже лайт объектов гц активность начинает уверернно кушат процессрное время


Прям целый набор взаимоисключающих параграфов. Не хочется активности ГЦ тогда не тащи данные в JVM просто спроси сразу число в том месте где данные хранятся те. БД.

Никакого логического обоснования необходимости буферизации нет для count (именно с точки зрения count функции а не подтягивания данных в стрим).

Если прям хочется скэкономить не тащи объект целиком, а лишь маркер его присутствия в heap.
boolean isCacheServeyIdExistsByIdentity();
Вернутый Boolean можно подсчитать и booleans и так закэшированы в jvm.

Даже больше если stream is sized то ответ count вернут сразу без даже какого либо каунтинга
В примере выше все портит .filter(x -> x.getSurveyId() == surveyId превщает в unknown size stream, а это тащит .map(this::getCachedByIdentity) в heap. (вообще getCachedByIdentity как то стремно выглядет ведь map функция подразумевается конвертер данных т.е. даные и так в памяти и мы просто с ними оперируем а тут выглядет так что поддтягиваются данные из кэша, что и side effect может иметь и еще и блокинг при этом в стриме получить)

Если нет возможности считать там где лежат данные и если повезло с surveyId и значения за диапазон небольшой не выходят, то пробуй не тащить целиком объект в head а тащи только getCachedSurveryIdByIdenity()) и проставь -XX:AutoBoxCacheMax ну например до 100тыс (если эти значения за 100тыс не выходят).

adminDontSleep

я словил но без профайлера к сожалению, реально был OOM на count() и xmx был 512 старт с 256 на нескольких потоках выбил ООМ

больше похоже подправление кода и постоянный перезапуск, и одна из кривых версий кода хранила ссылки и получили OOM или RAM не осталось на машинке свободной прям в этот раз. но эта версия тут же была исправлена и теперь не вспомнить какая из версий кидала OOM. OOM можно получить если бомбить память быстрее чем GC успевает освобождать ее. решается круткой edem для краковременных объектов чтобы не успевали как old помечаться объекты (у меня на 60мб не успевает чистить эдем и все в old попадает но тут объем маленький GC и так с лихвой успевает 60Мб проверять)
...
Рейтинг: 0 / 0
Stream и память
    #40127842
Фотография mayton
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Парень. Ну и 256Мб Xmx - это конечно верх жлобства. Щас самые мелкие виртуалки продаются начиная от 512 Мб.

Я не знаю что у тебя за задачи стоят но мне кажется надо эти цифры серъезно пересмотреть.
...
Рейтинг: 0 / 0
Stream и память
    #40127882
adminDontSleep
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
mayton
Парень. Ну и 256Мб Xmx - это конечно верх жлобства. Щас самые мелкие виртуалки продаются начиная от 512 Мб.

Я не знаю что у тебя за задачи стоят но мне кажется надо эти цифры серъезно пересмотреть.

256 для теста я делал,так у меня стоит старт 2 верх 4
на проде понятно что больше - но как бы чем менее требователен код к ресурсам,тем я лучше себя чувсвую
...
Рейтинг: 0 / 0
Stream и память
    #40127883
adminDontSleep
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
lleming

больше похоже подправление кода и постоянный перезапуск, и одна из кривых версий кода хранила ссылки и получили OOM или RAM не осталось на машинке свободной прям в этот раз. но эта версия тут же была исправлена и теперь не вспомнить какая из версий кидала OOM. OOM можно получить если бомбить память быстрее чем GC успевает освобождать ее. решается круткой edem для краковременных объектов чтобы не успевали как old помечаться объекты (у меня на 60мб не успевает чистить эдем и все в old попадает но тут объем маленький GC и так с лихвой успевает 60Мб проверять)

врядли,я не использую hot reload ,такчто сомнительно что новый джава процесс будет каким то образом конфликтовать с убитым процессом
так же в тесте был простейший класс и 1 метод - тоесть финты со стороны JIT тоже не подходяд

скорей всего что то пошло не так при снятии тред дампа,это же тоже не бесплатно
...
Рейтинг: 0 / 0
Stream и память
    #40127889
adminDontSleep
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
[quot lleming#22423238]

Прям целый набор взаимоисключающих параграфов. Не хочется активности ГЦ тогда не тащи данные в JVM просто спроси сразу число в том месте где данные хранятся те. БД.
/quot]
не в бд,а в кеше Хезелькаст
второе я ж не сказал что вот так буду делать - я просто эксперементировал,сейчас я чотко понимаю,что такой процесс не вызовет у нас проблем в части OOM ,но вызовет другую проблему- будет тратиться процессорное время на слишком частые проходы ГЦ- понятное дело что это не то что я хочу и таки работу этого метода лучше делегировать хезелю,благо у него есть достаточно продвинутый api
...
Рейтинг: 0 / 0
Stream и память
    #40127899
PetroNotC Sharp
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
adminDontSleep
скорей всего что то пошло не так
разумеется весь разговор без повторяемости ошибки это сотрясение воздуха.
Нагрузочный тест при 256. Ошибка должна повторятся..
А счас нет ни ошибки ни дампа ни теста.
Он тебе: "вот 10 причин"
Ты ему: "вряд ли... скорее всего это 11-я"
...
Рейтинг: 0 / 0
Stream и память
    #40127909
Фотография mayton
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
И надо обязательно разделить вопросы Hazelcast от вопросов Java-Stream.

При малейшем сомнении на тему того как работает stream - мы выбрасываем stream из кода
и заменяем его на цикл. Цикл прозрачен. Это базовая алгоритмическая конструкция.
И все подкапотные аллокации мы видим.

По хазелькасту - использовать его методы в ПЕРВУЮ очередь. Тоесть все count, filtering, группировки
и прочие операции хазель-алгебры мы делаем в запросе. Это технологично. Это правильно. И никто не скажет
что велосипед. Точно также работают и с реляционными базами. Максимум процессинга на уровне БД.

А вот делать копию выборки на клиента и что-то гонять в стримах - это велосипед.
...
Рейтинг: 0 / 0
Stream и память
    #40127917
lleming
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
а как hazel запущен отдельно ? или builtin в каждую ноду ?
...
Рейтинг: 0 / 0
Stream и память
    #40127934
Фотография mayton
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
lleming,
Правильный вопрос черт возьми.
...
Рейтинг: 0 / 0
Stream и память
    #40127979
Basil A. Sidorov
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
И, что характерно - ответ уже имеется: 22420286
...
Рейтинг: 0 / 0
132 сообщений из 132, показаны все 6 страниц
Форумы / Java [игнор отключен] [закрыт для гостей] / Stream и память
Целевая тема:
Создать новую тему:
Автор:
Закрыть
Цитировать
Найденые пользователи ...
Разблокировать пользователей ...
Читали форум (0):
Пользователи онлайн (0):
x
x
Закрыть


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