Добро пожаловать в форум, Guest  >>   Войти | Регистрация | Поиск | Правила | В избранное | Подписаться
Все форумы / Java Новый топик    Ответить
Топик располагается на нескольких страницах: [1] 2 3 4 5 6   вперед  Ctrl      все
 Stream и память  [new]
adminDontSleep
Member

Откуда:
Сообщений: 91
Может кто то подсказать такой вопрос

 public long getSurveyResultInProgressCount(long surveyId) {
    return surveyResultIdentitiesPersistDelayedMap.keySet()
      .stream()
      .map(this::getCachedByIdentity)
      .filter(x -> x.getSurveyId() == surveyId)
      .count();
  }

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

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

 .map(this::getCachedByIdentity)
мы получаем из кэша объекты - будут ли они все в памяти болтаться или же нет?

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

например вот так
 public long getSurveyResultInProgressCount(long surveyId) {
    return surveyResultIdentitiesPersistDelayedMap.keySet()
      .stream()
      .map(this::getCachedByIdentity)
      .map(SurveyResult::getSurveyId)
      .filter(x -> x == surveyId)
      .count();
  }


Сообщение было отредактировано: 12 янв 22, 19:20
12 янв 22, 19:12    [22419948]     Ответить | Цитировать Сообщить модератору
 Re: Stream и память  [new]
PetroNotC Sharp
Member

Откуда:
Сообщений: 10019
adminDontSleep,
Вопрос переформулируй по взрослому.
12 янв 22, 20:00    [22419983]     Ответить | Цитировать Сообщить модератору
 Re: Stream и память  [new]
adminDontSleep
Member

Откуда:
Сообщений: 91
PetroNotC Sharp
adminDontSleep,
Вопрос переформулируй по взрослому.

что именно тебе не понятно в вопросе?
12 янв 22, 20:03    [22419985]     Ответить | Цитировать Сообщить модератору
 Re: Stream и память  [new]
PetroNotC Sharp
Member

Откуда:
Сообщений: 10019
adminDontSleep,
А) слово "болтаться"
Б) нет второго вопроса.
))))
12 янв 22, 20:09    [22419988]     Ответить | Цитировать Сообщить модератору
 Re: Stream и память  [new]
PetroNotC Sharp
Member

Откуда:
Сообщений: 10019
adminDontSleep,
Ну загрузились в память объекты. После использования сборщик все собрал.
Тебе то что?
Учитывая "преждевременная оптимизация зло!" можно спросить про твой термин "болтаться"))))
Ну а визуально первый кусок кода лучше и понятнее.
Тогда занафига ты портишь код?
12 янв 22, 20:16    [22419994]     Ответить | Цитировать Сообщить модератору
 Re: Stream и память  [new]
adminDontSleep
Member

Откуда:
Сообщений: 91
PetroNotC Sharp
adminDontSleep,
А) слово "болтаться"
Б) нет второго вопроса.
))))


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

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


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

ворпос в том будут ли в памяти все время работы этого метода все Объекты которые мы выбрали из кеша?
12 янв 22, 20:22    [22419996]     Ответить | Цитировать Сообщить модератору
 Re: Stream и память  [new]
adminDontSleep
Member

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


проблема в том что не хочется в память тащить такого количество объектов ,во первых они достаточно объемные и их очень много ,а хип не резиновый
поэтому и возник вопрос - если все время работы метода все объекты будут в хипе - то такое мне не подходит ,если же элемент после второго map будет кандидат на удаление - то это уже более интересно .Но я подозреваю что пока метод целиком не отработает на все этим элементы будут ссылки из стрима и хип раздуется ровно на количество этих элеентов - что мне конечно же не подходит
12 янв 22, 20:27    [22419999]     Ответить | Цитировать Сообщить модератору
 Re: Stream и память  [new]
PetroNotC Sharp
Member

Откуда:
Сообщений: 10019
adminDontSleep,
Тебе не сложно счас сгенерить стрим на 10млн?
Ты прошлый раз 5 страниц экономил память, а тормозила субд.
12 янв 22, 20:32    [22420000]     Ответить | Цитировать Сообщить модератору
 Re: Stream и память  [new]
mayton
Member

Откуда: loopback
Сообщений: 53484
PetroNotC Sharp, чего ты на парня набросился. Он вполне себе хороший вопрос задает.
И своевременный. Беспокоиться о ресурсах. Я вижу 2 варианта. Первое - найти в API
описание того как работает стрим-процессинг. И второе - мемори профайлер. И смотреть.
12 янв 22, 20:34    [22420001]     Ответить | Цитировать Сообщить модератору
 Re: Stream и память  [new]
mayton
Member

Откуда: loopback
Сообщений: 53484
Вот по 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(). Вот какое-то у меня есть предчувствие что лучше брать тот итератор
который уже дан без лишних преобразований.

 public long getSurveyResultInProgressCount(long surveyId) {
    return surveyResultIdentitiesPersistDelayedMap.entrySet()
    ....
  }
12 янв 22, 20:41    [22420011]     Ответить | Цитировать Сообщить модератору
 Re: Stream и память  [new]
PetroNotC Sharp
Member

Откуда:
Сообщений: 10019
mayton,
Совсем нет.
Ты силен в алгоритмизации. Я в архитектуре.
Почему у нас должны быть одинаковые вопросы.
Я ставлю оценку за технику а ты за артистизм))))
Ты правда думаешь что надо переписать код?
12 янв 22, 20:58    [22420025]     Ответить | Цитировать Сообщить модератору
 Re: Stream и память  [new]
mayton
Member

Откуда: loopback
Сообщений: 53484
Ты чего градус повышаешь? Обсуждай код а не людей.
12 янв 22, 21:34    [22420037]     Ответить | Цитировать Сообщить модератору
 Re: Stream и память  [new]
adminDontSleep
Member

Откуда:
Сообщений: 91
[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.


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

проверять я конечно проверю- но может быть кто то знает и сталкивался с этим
12 янв 22, 22:25    [22420067]     Ответить | Цитировать Сообщить модератору
 Re: Stream и память  [new]
PetroNotC Sharp
Member

Откуда:
Сообщений: 10019
mayton
Ты чего градус повышаешь? Обсуждай код а не людей.
ты только градусы видишь. Я столько фактов выше привел.
Пусть ТС сделает тест что кончилась память.
Это же разумно?
Тебе некуда же бежать и спешить?
Верно?
Я именно это просил ТС.
12 янв 22, 22:49    [22420079]     Ответить | Цитировать Сообщить модератору
 Re: Stream и память  [new]
PetroNotC Sharp
Member

Откуда:
Сообщений: 10019
adminDontSleep
мой вопрос простой
мой тоже. Он из жизни.
"ТС работает больше отвечающих" (с)
12 янв 22, 22:50    [22420082]     Ответить | Цитировать Сообщить модератору
 Re: Stream и память  [new]
mayton
Member

Откуда: loopback
Сообщений: 53484
adminDontSleep

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

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

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

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


P.S. Немного напрягает твоя терминология. Ты говоришь "кеш". Это потому что ты его так назвал? Или
под интерфейсом Map у тебя скрыта реализация EhCache или чего-то подобного?
12 янв 22, 23:08    [22420088]     Ответить | Цитировать Сообщить модератору
 Re: Stream и память  [new]
PetroNotC Sharp
Member

Откуда:
Сообщений: 10019
mayton,
+1
Про кеш верно.
Если это кеш1 то мы рожаем объект из бд в оперативке из бд,
Если это кеш2 то мы пробегаем по объектам.
Если...
Гадание гадалок а не программистов.
12 янв 22, 23:24    [22420098]     Ответить | Цитировать Сообщить модератору
 Re: Stream и память  [new]
adminDontSleep
Member

Откуда:
Сообщений: 91
mayton
adminDontSleep

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

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

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

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


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

кеш в данном случае это хезель каст
13 янв 22, 09:44    [22420198]     Ответить | Цитировать Сообщить модератору
 Re: Stream и память  [new]
PetroNotC Sharp
Member

Откуда:
Сообщений: 10019
adminDontSleep
хезель
ну он же настраивается. Меньше памяти жрать или больше.
mayton верно же сказал. Если все в кеше в оперативке, то память не меняется в методе.
Тяжело выбросить в лог замер по памяти?
13 янв 22, 09:51    [22420200]     Ответить | Цитировать Сообщить модератору
 Re: Stream и память  [new]
PetroNotC Sharp
Member

Откуда:
Сообщений: 10019
Как то, смотрим свой код но абсолютно ничего не делаем.
13 янв 22, 09:52    [22420201]     Ответить | Цитировать Сообщить модератору
 Re: Stream и память  [new]
mayton
Member

Откуда: loopback
Сообщений: 53484
adminDontSleep
mayton
пропущено...

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

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


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

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

А Hazelcast в данном случае является главным источником данных? Или он просто является слоем перед DBMS?
13 янв 22, 10:51    [22420236]     Ответить | Цитировать Сообщить модератору
 Re: Stream и память  [new]
adminDontSleep
Member

Откуда:
Сообщений: 91
PetroNotC Sharp
adminDontSleep
хезель
ну он же настраивается. Меньше памяти жрать или больше.
mayton верно же сказал. Если все в кеше в оперативке, то память не меняется в методе.
Тяжело выбросить в лог замер по памяти?

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

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

если есть кто не согласен с этим - прошу к дискуссии
13 янв 22, 10:52    [22420238]     Ответить | Цитировать Сообщить модератору
 Re: Stream и память  [new]
Basil A. Sidorov
Member

Откуда:
Сообщений: 11595
adminDontSleep
проблема в том что не хочется в память тащить такого количество объектов ,во первых они достаточно объемные и их очень много ,а хип не резиновый
Проблема совсем в другом.
Есть "объект" и "данные объекта".
"Объект" это "указатель на данные объекта и сами данные" (они могут храниться раздельно) или "указатель на (другой) объект".
Если объект это какой-нибудь Long, то указатель на данные объекта будет больше, чем сами данные.
Если объект это какой-нибудь байтовый буфер на пару килобайт, то указатель на данные объекта - пренебрежимо мал.
Так вот - данные объекта не копируются, если вы специально этим не озаботились.
13 янв 22, 10:52    [22420239]     Ответить | Цитировать Сообщить модератору
 Re: Stream и память  [new]
adminDontSleep
Member

Откуда:
Сообщений: 91
mayton
adminDontSleep
пропущено...

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

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

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

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

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

вот на каждом этом этапе интересует поведение памяти
13 янв 22, 10:58    [22420240]     Ответить | Цитировать Сообщить модератору
 Re: Stream и память  [new]
adminDontSleep
Member

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

в целом ты прав,но забываешь о том ,что объекты изнчально находятся в кеще(в данном случае это хезель каст) и чтобы стрим начал с ними работать я думаю они будут целиком загружены в хип
13 янв 22, 11:01    [22420242]     Ответить | Цитировать Сообщить модератору
Топик располагается на нескольких страницах: [1] 2 3 4 5 6   вперед  Ctrl      все
Все форумы / Java Ответить