|
Stream и память
|
|||
---|---|---|---|
#18+
PetroNotC Sharp mayton Померяй время отклика в двух случаях. Без работы руками никак Он - странный. Я дал ссылку на доку - он говорит мы не выяснили как работает Stream. Мне кажется что в будущих топиках надо взять за правило вообще ставить в игнор все сомнения новичков. Пускай обосновывают свои сомнения фактами. А то получается мы тут как ... психологи. ... |
|||
:
Нравится:
Не нравится:
|
|||
13.01.2022, 21:48 |
|
Stream и память
|
|||
---|---|---|---|
#18+
mayton, Какой новичок? Это же стас))) ... |
|||
:
Нравится:
Не нравится:
|
|||
13.01.2022, 23:04 |
|
Stream и память
|
|||
---|---|---|---|
#18+
В данном случае для подсчета оптимально использовать https://docs.hazelcast.org/docs/4.0/javadoc/com/hazelcast/map/IMap.html#aggregate-com.hazelcast.aggregation.Aggregator-com.hazelcast.query.Predicate- и в heap точно объекты не потянет, и скорость работы в десятки/сотни раз быстрее будет. ... |
|||
:
Нравится:
Не нравится:
|
|||
14.01.2022, 12:33 |
|
Stream и память
|
|||
---|---|---|---|
#18+
Как я помню, цепочка стримов без терминальной операции всего лишь "план действия" Код: java 1. 2. 3. 4. 5.
Само выполнение запускается одной из терминальных операций. После вызова терминальной операции элементы из "источника стрима" начинают дергаться по одному и проходить цепочку от начала до конца. Если у нас цепочка состоит из методов на подобие Код: java 1.
то никаких новых обектов в памяти не появиться (по идее). Помять может начать расти, если: 1) В конце мы все собираем в коллекцию (собственно на размер коллекции). 2) Мы сами явно где то в цепочке создаем новые объекты. Причем, если их никуда не сохранять, (например, просто делаем вывод в консоль) то после "пролета цепочки" они будут доступны gs (т.е. память тоже не должна сильно страдать). 3) Если используется метод sort , так как в этом случае элементы не будут пролетать всю цепочку насквозь, а только до операции sort и после того как все элементы достигнут этой операции нижестоящая часть цепочки опять будет по одному дергать элементы (sort как бы становиться аналог источника стрима). Тут размер "новой" памяти - это размер структуры, в которой будут хранится элементы для сортировки. P.s. Выше написанное не утверждение, а тема для обсуждения. ... |
|||
:
Нравится:
Не нравится:
|
|||
14.01.2022, 15:13 |
|
Stream и память
|
|||
---|---|---|---|
#18+
Код: java 1. 2. 3. 4. 5. 6. 7.
1) метод count() запускает цепочку. 2) метод .map(this::getCachedByIdentity) получает из стрима первый элемент - ключ мапы и создает из него объект. 3) проверяется условие фильтра, если созданный объект проходит его, то .. 4) метод count() увеличивает счетчик на единицу. 5) созданный объект доступен для GC. 6) повторяются дейстия 2-5 для всех оставшихся элементов стрима. ... |
|||
:
Нравится:
Не нравится:
|
|||
14.01.2022, 15:30 |
|
Stream и память
|
|||
---|---|---|---|
#18+
faustgreen, п. 2 может не создавать а взять ранее созданный ... |
|||
:
Нравится:
Не нравится:
|
|||
14.01.2022, 15:35 |
|
Stream и память
|
|||
---|---|---|---|
#18+
faustgreen Как я помню, цепочка стримов без терминальной операции всего лишь "план действия" Код: java 1. 2. 3. 4. 5.
Само выполнение запускается одной из терминальных операций. После вызова терминальной операции элементы из "источника стрима" начинают дергаться по одному и проходить цепочку от начала до конца. Если у нас цепочка состоит из методов на подобие Код: java 1.
то никаких новых обектов в памяти не появиться (по идее). Помять может начать расти, если: 1) В конце мы все собираем в коллекцию (собственно на размер коллекции). 2) Мы сами явно где то в цепочке создаем новые объекты. Причем, если их никуда не сохранять, (например, просто делаем вывод в консоль) то после "пролета цепочки" они будут доступны gs (т.е. память тоже не должна сильно страдать). 3) Если используется метод sort , так как в этом случае элементы не будут пролетать всю цепочку насквозь, а только до операции sort и после того как все элементы достигнут этой операции нижестоящая часть цепочки опять будет по одному дергать элементы (sort как бы становиться аналог источника стрима). Тут размер "новой" памяти - это размер структуры, в которой будут хранится элементы для сортировки. P.s. Выше написанное не утверждение, а тема для обсуждения. 4) зависит от кучи настроек ПО по кешированию которое перебирает стрим. Это покрывает все п.п. c 1 по 3 ... |
|||
:
Нравится:
Не нравится:
|
|||
14.01.2022, 15:43 |
|
Stream и память
|
|||
---|---|---|---|
#18+
faustgreen, Представь что он перебирает стримом фотографии fullhd 4k ... |
|||
:
Нравится:
Не нравится:
|
|||
14.01.2022, 15:45 |
|
Stream и память
|
|||
---|---|---|---|
#18+
PetroNotC Sharp 4) зависит от кучи настроек ПО по кешированию которое перебирает стрим. Это покрывает все п.п. c 1 по 3 Скорее всего... Я стримы поверхностно знаю. Поэтому и написал, чтоб не рассматривали как утверждение. ... |
|||
:
Нравится:
Не нравится:
|
|||
14.01.2022, 15:59 |
|
Stream и память
|
|||
---|---|---|---|
#18+
faustgreen, Увы. Лучше обсуждать те темы, где чел находится возле компа. Тут этого нет. Гадать можно что угодно. ... |
|||
:
Нравится:
Не нравится:
|
|||
14.01.2022, 16:19 |
|
Stream и память
|
|||
---|---|---|---|
#18+
faustgreen Код: java 1. 2. 3. 4. 5. 6. 7.
1) метод count() запускает цепочку. 2) метод .map(this::getCachedByIdentity) получает из стрима первый элемент - ключ мапы и создает из него объект. 3) проверяется условие фильтра, если созданный объект проходит его, то .. 4) метод count() увеличивает счетчик на единицу. 5) созданный объект доступен для GC. 6) повторяются дейстия 2-5 для всех оставшихся элементов стрима. примерно так и думал - единственно у меня сомнения на счет 5 пункта- ведь стрим оперирует не одиночными объектами ,а множеством- соотвественно до конца работы стрима стрим будет иметь ссылки на эти объекты в хипе и они не будут доступны для гц ... |
|||
:
Нравится:
Не нравится:
|
|||
14.01.2022, 21:43 |
|
Stream и память
|
|||
---|---|---|---|
#18+
Есть такие шаблоны как Vizitor, Iterator. ... |
|||
:
Нравится:
Не нравится:
|
|||
14.01.2022, 21:51 |
|
Stream и память
|
|||
---|---|---|---|
#18+
adminDontSleep у меня сомнения на счет 5 пункта- ведь стрим оперирует не одиночными объектами ,а множеством Если поток не предоставляет буферизации или/и произвольного доступа, то "в каждый момент времени" он "работает" с единственным объектом. Если поток "проходит" какую-то коллекцию, то ссылки удерживает не он, а этот объект-коллекция. Т.е. не поток "виноват" в том, что (конкретный) объект нельзя убрать как мусор. ... |
|||
:
Нравится:
Не нравится:
|
|||
14.01.2022, 22:56 |
|
Stream и память
|
|||
---|---|---|---|
#18+
adminDontSleep примерно так и думал - единственно у меня сомнения на счет 5 пункта- ведь стрим оперирует не одиночными объектами ,а множеством- соотвественно до конца работы стрима стрим будет иметь ссылки на эти объекты в хипе и они не будут доступны для гц Вверху уже писали, что стрим это что то вроде цикла. Т.е. твой код Код: java 1. 2. 3. 4. 5. 6. 7.
условно можно представить так: Код: java 1. 2. 3. 4. 5. 6. 7. 8. 9. 10.
Т.е. для метода getSurveyResultInProgressCount переменная SomeClass object будет являться локальной, и соответственно по выходу из метода ссылка на нее потеряется, как и на все другие локальные переменные. Стрим то работает со множеством, но делает это с каждым элементом этого множества по отдельности, сначала полностью обрабатываем один элемент, потом второй и т.д. ... |
|||
:
Нравится:
Не нравится:
|
|||
14.01.2022, 23:13 |
|
Stream и память
|
|||
---|---|---|---|
#18+
Я это и предлагал в начале топика. Но здесь - смешались кони и люди. Автор поразительным образом сделал "замес" из технологий Hazelcast и Java-технологий и сам себя запутал. Вот надо разделять мух и котлет на будущее. ... |
|||
:
Нравится:
Не нравится:
|
|||
14.01.2022, 23:32 |
|
Stream и память
|
|||
---|---|---|---|
#18+
Basil A. Sidorov adminDontSleep у меня сомнения на счет 5 пункта- ведь стрим оперирует не одиночными объектами ,а множеством Если поток не предоставляет буферизации или/и произвольного доступа, то "в каждый момент времени" он "работает" с единственным объектом. Если поток "проходит" какую-то коллекцию, то ссылки удерживает не он, а этот объект-коллекция. Т.е. не поток "виноват" в том, что (конкретный) объект нельзя убрать как мусор. вот видишь - ты слабо себе представляешь работу стрима и путаешь его с другими стримами- у них вообще нет ничего общего в операции проежуточные они применяются не к элементам а с стриму ,они модифицируют стрим!!! а не элемент некторые тут вообще путают стрим с цилклом - они похожи только по каким то субъективным понятиям - фатически между ними ничего общего стрим вообще работает по принципу пул итераций так что базиль пока не убедительно - я лично сомневаюсь что до заверщения работы стрим будет терять ссылки на эти объекты,тем самым давая дорогу ГЦ- конечно лучше всего провести какой то наглядый тест с профилировщиком ... |
|||
:
Нравится:
Не нравится:
|
|||
15.01.2022, 01:18 |
|
Stream и память
|
|||
---|---|---|---|
#18+
faustgreen Т.е. для метода getSurveyResultInProgressCount переменная SomeClass object будет являться локальной, и соответственно по выходу из метода ссылка на нее потеряется, как и на все другие локальные переменные. Стрим то работает со множеством, но делает это с каждым элементом этого множества по отдельности, сначала полностью обрабатываем один элемент, потом второй и т.д. по выходу из метода понятно что все ссылки будут занулены - ибо это как ты верно сказал локальные переменные у нас же вопрос не в том,что будет по выходу из метода а в том,как будет вести себя память в процессе работы стрима!это очень важно базиль утрвеждает что стрим будет обрабатывать поэлементно эти объеты и забывать про них- но это скорей всего не так ... |
|||
:
Нравится:
Не нравится:
|
|||
15.01.2022, 01:21 |
|
Stream и память
|
|||
---|---|---|---|
#18+
adminDontSleep, посмотри код выше , где представлен альтерантивный вариант метода через цикл for. Так примерно работает стрим внутри. Т.е. переменная object обновляется каждую итерацию цикла, ссылка на старый объект теряется. А Basil A. Sidorov толковые вещи пишет, перечитай его последний пост. ... |
|||
:
Нравится:
Не нравится:
|
|||
15.01.2022, 02:01 |
|
Stream и память
|
|||
---|---|---|---|
#18+
Посмотри еще доки официальные, там есть, например, вот это: reduce Код: java 1. 2. 3. 4. 5. 6. 7. 8. 9. 10.
... |
|||
:
Нравится:
Не нравится:
|
|||
15.01.2022, 02:08 |
|
Stream и память
|
|||
---|---|---|---|
#18+
Т.е. по факту реализация метода reduce - это цикл. Теперь возми вот этот код: Код: java 1. 2. 3. 4.
и выполни его для 1000 элементов. Сколько у тебя в этом случае создасться объектов в памяти, на которые будет удерживаться ссылка? ... |
|||
:
Нравится:
Не нравится:
|
|||
15.01.2022, 02:26 |
|
Stream и память
|
|||
---|---|---|---|
#18+
adminDontSleep так что базиль пока не убедительно - я лично сомневаюсь что до заверщения работы стрим будет терять ссылки на эти объекты,тем самым давая дорогу ГЦ- конечно лучше всего провести какой то наглядый тест с профилировщиком Вот тест: 1) Этот код будет работать бесконечно: Код: java 1. 2. 3. 4. 5. 6. 7. 8. 9. 10. 11. 12. 13. 14.
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.
... |
|||
:
Нравится:
Не нравится:
|
|||
15.01.2022, 02:58 |
|
Stream и память
|
|||
---|---|---|---|
#18+
В первом примере все элементы бесконечного стрима "пролетают насквозь" нашу цепочку методов стрима. Создается бесконечное количество строк "0", но они каждую итерацию присваиваются одной и той же переменной. Во втором случае создается бесконечное количество строк "0", которые накапливаются в методе sorted() и не проходят дальше (накапливаются в памяти). ... |
|||
:
Нравится:
Не нравится:
|
|||
15.01.2022, 03:12 |
|
Stream и память
|
|||
---|---|---|---|
#18+
adminDontSleep вот видишь - ты слабо себе представляешь работу стрима Допустим, что это факт, а не ваша вольная интерпретация. Как из этого факта следует, что объект-поток удерживает от сборки мусора те элементы, которые он "потрогал"? P.S. Я в курсе, что конкретные промежуточные операции (например - сортировка) будут "удерживать" весь сортируемый набор, но другим промежуточным операциям (например - счётчик) это совсем не требуется. ... |
|||
:
Нравится:
Не нравится:
|
|||
15.01.2022, 03:31 |
|
Stream и память
|
|||
---|---|---|---|
#18+
adminDontSleep у нас же вопрос не в том,что будет по выходу из метода а в том,как будет вести себя память в процессе работы стрима!это очень важно покажиПамять() до и после вызова метода. Разве не очевидно? Код: java 1. 2. 3. 4. 5. 6. 7.
А как память внутри метода зачем тебе? ... |
|||
:
Нравится:
Не нравится:
|
|||
15.01.2022, 10:44 |
|
Stream и память
|
|||
---|---|---|---|
#18+
adminDontSleep это очень важно простейшая логика и здравый смысл говорят обратное. Без профилирования в целом метода нельзя копаться внутри метода. Если конечно твоя цель не просто поболтать бесцельно. С другой стороны, бросив три фразы выше кто их обосновывать будет? 22421401 ... |
|||
:
Нравится:
Не нравится:
|
|||
15.01.2022, 12:52 |
|
|
start [/forum/topic.php?fid=59&msg=40126787&tid=2120265]: |
0ms |
get settings: |
18ms |
get forum list: |
5ms |
check forum access: |
1ms |
check topic access: |
1ms |
track hit: |
36ms |
get topic data: |
3ms |
get forum data: |
1ms |
get page messages: |
433ms |
get tp. blocked users: |
0ms |
others: | 361ms |
total: | 859ms |
0 / 0 |