powered by simpleCommunicator - 2.0.30     © 2024 Programmizd 02
Map
Форумы / Java [игнор отключен] [закрыт для гостей] / Stream и память
25 сообщений из 132, страница 3 из 6
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
25 сообщений из 132, страница 3 из 6
Форумы / Java [игнор отключен] [закрыт для гостей] / Stream и память
Целевая тема:
Создать новую тему:
Автор:
Закрыть
Цитировать
Найденые пользователи ...
Разблокировать пользователей ...
Читали форум (0):
Пользователи онлайн (0):
x
x
Закрыть


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