我有一个相当大的文件(20-30 Mb)。我有一张 map ,其中有一个键和相应的正则表达式作为值,我需要在文件中进行 grep 以获取键的实际值并将新键值存储在新 map 中。所以这是我的方法
contextmap //initial map which contains key and value in form of regex
contextstrings // final map supposed to have value after the grep
def fgrepFuture(e: (String,String)) = Future {
val re = new Regex(e._2)
Source.fromFile(f).getLines.foreach {
re findFirstMatchIn _ match {
case None => ("","")
case Some(x) =>(e._1,x.group(1))
}
}
}
val fg = Future.traverse(tmpmap)(fgrepFuture)
fg onComplete{
case tups => for(t <- tups) contextstrings += (t.toString.split(",").head -> t.toString.split(",").tail.head)
}
这里的问题是,当 future 完成我的其余代码(基于 akka actors 的异步模型)时,我已经走得太远以至于我没有快速从文件中获取 grepped 值(我想成为全局可用)。我需要快速获取值,我不知道为什么这种方法没有给我(因为 future 有多个并行工作),所以请指出缺陷。另外 如果有从相当大的文件中获取多个值的更好方法也请提出建议。
最佳答案
您可以确定程序中的最远点,如果到达该点并且功能不完整,则需要使用 await,同时您可以做一些工作的好处有限。 您可以做的另一件事是尝试以类似这样的并行方式进行 grep。
val chunkSize = 128 * 1024
val iterator = Source.fromFile(path).getLines.grouped(chunkSize)
iterator.foreach { lines =>
lines.par.foreach { line => process(line) }
}
基于 this post .
关于regex - 使用 scala future 的大文件的多个并行 grep 没有所需的速度,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/19978778/