Предположим, у меня есть ленивый итератор [Item]. Объект items создается лениво, только когда мы итерируем итератор. Элементы дорогие для создания.Scala: как «предварительно загрузить» содержимое ленивого итератора?
Я хотел бы сериализовать в качестве массива JSON этот итератор. Он работает (с модулем Jackson scala), но мне кажется, что он недостаточно эффективен.
Насколько я понимаю, в настоящее время он работает так:
- Compute Следующий товар
- Serialize товар
- Compute Следующий товар
- Serialize товар
- Compute Следующий товар
- Сериализовать товар
Я бы хотел, чтобы вычисления элементов и сериализация элементов происходили параллельно.
Я бы хотел, чтобы Iterator начал вычислять определенное количество следующих предметов при чтении следующего элемента.
Например, я хотел бы, чтобы при выполнении iterator.next() за сценой вычислялись следующие 50 элементов без блокировки итерационного потока (он должен ждать только следующего элемента).
Я видел «BufferedIterator», но это не совсем то, что мне нужно, так как я не очень хочу, чтобы запросить «головы» в явном виде, и мне нужно больше чем 1 деталь для предварительной загрузки
Любой идея о том, как это можно достичь?
Я нормально для решения заменяющего итератора с потоком тоже, но отдают предпочтение итератора из-за снижения использования памяти
Вы пробовали [GroupedIterator] (http://scala-lang.org/api/2.11.8/#scala.collection.Iterator$GroupedIterator)? – laughedelic
@laughedelic Я уже использую 'inputIterator.grouped (chunkSize) .map (computeItemsChunk) .flatten', так что мои объекты вычисляются в кусках, но я не уверен в том, что вы предлагаете –
. Вы говорите:« при выполнении итератора .next(), за сценой, вычисляются следующие 50 элементов ». Это то, что происходит с 'GroupedIterator': каждый раз, когда вы вызываете' .next', вычисляется новый фрагмент. Разве вы этого не хотите? – laughedelic