Предположим, у меня есть Stream
длины 1,000,000
со всеми 1.Фильтр потока # Испускает память для 1 000 000 предметов
scala> val million = Stream.fill(100000000)(1)
million: scala.collection.immutable.Stream[Int] = Stream(1, ?)
scala> million filter (x => x % 2 == 0)
Exception in thread "main" java.lang.OutOfMemoryError: GC overhead limit exceeded
Я получаю исключение Out of Memory
.
Затем я попробовал тот же filter
позвонить с List
.
scala> val y = List.fill(1000000)(1)
y: List[Int] = List(1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1 ...
scala> y.filter(x => x % 2 == 0)
res2: List[Int] = List()
Все еще это удается.
Почему у Stream#filter
заканчивается память, но List#filter
заканчивается просто отлично?
И наконец, с большим потоком, будет filter
результат в ленивой оценке всего потока?
Посмотреть это сообщение: http://stackoverflow.com/questions/5159000/stream-vs-views-vs-iterators. Он работает с 'def million = Stream.fill (100000000) (1)' в качестве заметок. – Brian
Я предполагаю, что ячейки, которые содержат индивидуальные значения в потоке, больше в памяти, чем ячейки, которые составляют отдельные элементы в списке. Кроме того, если вы находитесь в Repl, и вы сначала выделили список, а _then_ - поток, вы настраиваете себя на неудачу. – KChaloux
@KChaloux - Нет - моя ошибка scala REPL упала после исключения, поэтому я снова запустил «scala» за один миллионный тест List. В результате исключения я ожидал, что «scala» выпустит свои ресурсы. –