Скала потоки и их использование памяти - PullRequest
12 голосов
/ 19 декабря 2011

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

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

Ответы [ 2 ]

12 голосов
/ 20 декабря 2011

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

Например:

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
6 голосов
/ 19 декабря 2011

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

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

...