【发布时间】:2016-11-30 14:50:37
【问题描述】:
假设我有一个惰性迭代器[Item]。仅当我们迭代迭代器时,才会延迟创建 items 对象。这些物品的制作成本很高。
我想将此迭代器序列化为 JSON 数组。它可以工作(使用 Jackson scala 模块),但在我看来效率不够。
据我了解,目前的工作方式如下:
- 计算下一项
- 序列化项目
- 计算下一项
- 序列化项目
- 计算下一项
- 序列化项目
我希望项目的计算和项目的序列化并行进行。
我想要一个迭代器,它会在读取下一项时开始计算定义数量的下一项。
例如,我希望在执行 iterator.next() 时,在幕后计算接下来的 50 个项目,而不会阻塞迭代线程(它应该只等待下一个可用元素)。
我见过“BufferedIterator”,但它并不是我所需要的,因为我真的不想明确地查询“head”,而且我需要超过 1 个项目来预加载
知道如何实现这一点吗?
我也可以用 Stream 替换 Iterator 的解决方案,但由于内存使用率较低,我更喜欢 Iterator
【问题讨论】:
-
你试过GroupedIterator吗?
-
@laughedelic 我已经在使用
inputIterator.grouped(chunkSize).map(computeItemsChunk).flatten,所以我的项目是按块计算的,但我不确定你的建议是什么 -
您说“在执行 iterator.next() 时,在幕后,计算接下来的 50 个项目”。这就是
GroupedIterator发生的情况:每次调用.next时,都会计算一个新块。这不是你想要的吗? -
@laughedelic 我已经重写了这句话。计算接下来的 50 个项目非常昂贵,我不希望在此期间阻塞迭代线程。计算应该发生在另一个线程中,而迭代线程应该只等待下一个项目而不是整个项目块。你有什么实现建议吗?
标签: scala collections iterator