【发布时间】:2014-01-01 01:59:48
【问题描述】:
好的,我正在使用 dbpedia 处理英文维基百科转储。到目前为止,他们的实现扩展了Traversable 并提供了一个foreach 来检查转储。但是,我想要典型的地图操作,例如map,grouped等。这是我打开的问题:https://github.com/dbpedia/extraction-framework/issues/140
所以我添加了一个 getter 来接收一个可迭代的和一个迭代器。现在有趣的部分:
source.iterable
.map(parser)
.zipWithIndex
.map { case(page: PageMode, i: Int) =>
if(i%1000 == 0){println(i)}
(...)
}
.grouped(2000)
上面的代码内存不足。然而:
source.iterator
.map(parser)
.zipWithIndex
.map { case(page: PageNode, i: Int) =>
if(i%1000 == 0){println(i)}
(...)
}
.grouped(2000)
此代码按预期立即返回。
在我看来,一旦内存耗尽,第一个示例就会完全运行代码,因为它试图将转储存储在内存中。后者没有。但是,后者返回的是 Seq 上的迭代器,而不是迭代器上的迭代器。
这是一个可迭代类的预期还是我做错了什么。我希望它们都立即返回并仅在迭代后才消耗内存。
感谢您的帮助! 卡斯滕
【问题讨论】:
-
您可能会发现this post 很有用。