私は怠惰なイテレータ[アイテム]を持っているとしましょう。 itemsオブジェクトは、イテレータを反復処理するときにのみ遅延生成されます。アイテムは高価です。Scala:遅延イテレータのコンテンツを「プリロードする」方法?
このイテレータをJSON配列としてシリアル化したいと思います。それは(Jacksonのscalaモジュールで)動作しますが、それは私には十分効率的ではないようです。
私の知る限り理解し、それは現在このように動作します:
- 計算し、次の項目
- のSerialize項目
- 計算し、次の項目
- のSerialize項目
- 計算し、次の項目
- シリアル化アイテム
私はアイテムの計算とアイテムのシリアライズを並行して行いたいと思います。
次のアイテムを読むとき、次のアイテムの定義された量の計算を開始するイテレータが必要です。
たとえば、シーンの背後でiterator.next()を実行すると、反復スレッドがブロックされずに次の50個のアイテムが計算されます(次の要素が利用可能になるまで待ちます)。
私は「BufferedIterator」を見てきましたが、私は本当に、明示的に「ヘッド」を照会したくないとして、それは、私が必要と正確に何ではない、と私は
どれをプリロードするために1つの以上のアイテムを必要としますこれがどのように達成されるかについてのアイデア?
私もストリームでIteratorを置き換える解決するためにOKですが、私はあなたの問題の権利を理解している場合が低いため、メモリ使用量
[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