gpt4 book ai didi

scala - Iterator[Something] 到 Iterator[Seq[Something]]

转载 作者:行者123 更新时间:2023-12-02 17:31:03 25 4
gpt4 key购买 nike

我需要处理一个“大”文件(内存中放不下的文件)。

我想批处理数据。比方说我想将它们插入到数据库中。但是由于它太大而无法放入内存,因此一个一个地处理元素也太慢了。

所以我想从 Iterator[Something]Iterator[Iterable[Something]] 到批处理元素。

从这里开始:

CSVReader.open(new File("big_file"))
.iteratorWithHeaders
.map(Something.parse)
.foreach(Jdbi.insertSomething)

我可以在 foreach 语句中使用可变序列做一些肮脏的事情并刷新每个 x 元素,但我确信有更聪明的方法来做到这一点......

// Yuk... :-(
val buffer = ArrayBuffer[Something]()
CSVReader.open(new File("big_file"))
.iteratorWithHeaders
.map(Something.parse)
.foreach {
something =>
buffer.append(something)
if (buffer.size == 1000) {
Jdbi.insertSomethings(buffer.toList)
buffer.clear()
}
}
Jdbi.insertSomethings(buffer.toList)

最佳答案

如果您的批处理可以具有固定大小(如您的示例所示),则 Scala 的 Iterator 上的 grouped 方法完全符合您的要求:

val iterator = Iterator.continually(1)

iterator.grouped(10000).foreach(xs => println(xs.size))

这将在固定数量的内存中运行(当然不计算终端在内存中存储的任何文本)。

我不确定您的 iteratorWithHeaders 返回什么,但如果它是 Java 迭代器,您可以像这样将它转换为 Scala 迭代器:

import scala.collection.JavaConverters.

val myScalaIterator: Iterator[Int] = myJavaIterator.asScala

这将保持适当的惰性。

关于scala - Iterator[Something] 到 Iterator[Seq[Something]],我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/33320146/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com