如何加快以下x=>x.Name==valueToFind
代码的速度?目前处理70MB文本大约需要5分钟,所以我可能做了一些非常错误的事情,因为一个普通的scala等价物需要几秒钟。
(another question的后续行动)
scalaz-stream
答案 0 :(得分:0)
我认为你可以使用其中一个process1块方法来块。如果您希望在将行合并到输出格式时进行大量并行处理,请确定有序输出是否重要,并使用与合并或T形结合的通道。这也将使其可重复使用。因为你正在进行非常少量的处理,所以你可能会在头顶上淹没,所以你必须更加努力地使你的工作单元足够大而不会被淹没。
答案 1 :(得分:0)
以下是基于@ user1763729的分块建议。虽然它感觉很笨,但它和原版一样慢。
val converter: Task[Unit] = {
val docSep = "~~~"
io.linesR("myInput.txt")
.intersperse("\n") // handle empty documents (chunkBy has to switch from true to false)
.zipWithPrevious // chunkBy cuts only *after* the predicate turns false
.chunkBy{
case (Some(prev), line) => { val words = line.split(" "); words.length == 0 || words(0) != docSep }
case (None, line) => true }
.map(_.map(_._1.getOrElse(""))) // get previous element
.map(_.filter(!Set("", "\n").contains(_)))
.map(lines => lines.head.split(" ").tail.mkString(" ") + ": " + lines.tail.mkString(" "))
.intersperse("\n")
.pipe(text.utf8Encode)
.to(io.fileChunkW("stillSlowOutput.txt"))
.run
}
编辑:
实际上,执行以下操作(只是阅读文件,没有写入或处理)已经需要1.5分钟,所以我想没有太多希望加快这一点。
val converter: Task[Unit] = {
io.linesR("myInput.txt")
.pipe(text.utf8Encode)
.run
}