Подтвердить что ты не робот

Scala потоки и использование их памяти

Как я понимаю, Stream сохраняет недавно обработанные элементы. Я думаю, он не сохраняет все оцениваемые элементы (это невозможно), поэтому он, вероятно, использует некоторый внутренний "кеш".

Правильно ли это? Могу ли я контролировать размер и политики этого кеша?

4b9b3361

Ответ 1

Потоки похожи на списки, которые генерируют их члены, как они требуются. Как только элемент был сгенерирован, он сохраняется в потоке и повторно используется.

Например:

lazy val naturals: Stream[Int] = Stream.cons(0, naturals.map{_ + 1})

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

naturals(5)

он будет генерировать элементы 0-5 и возвращать 5, если я тогда вызову

naturals(8)

Он будет повторно использовать первые 6 элементов и сгенерировать еще 3.

Если вас беспокоит использование памяти, вы можете использовать Stream.drop(num) для создания нового потока с элементами num, удаленными с самого начала, что позволяет усеченным элементам собирать мусор со старым потоком. Например:

naturals(5) //returns 5
val truncated = naturals.drop(4)
truncated(5) //returns 9

Ответ 2

Поток-объект сохраняет все ссылки, которые были оценены/доступны до сих пор. Stream работает как List. Каждый элемент, который может быть достигнут из сохраненной ссылки и к которому уже был получен доступ хотя бы один раз, не будет собирать мусор.

Итак, в основном ваши указатели на поток и то, что вы оценили до сих пор, определяют, что будет кэшироваться.