regex - 使用 scala future 的大文件的多个并行 grep 没有所需的速度

标签 regex scala parallel-processing akka future

我有一个相当大的文件(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/

相关文章:

javascript - 使用regexp javascript从源文件中查找所有导入的文件名

windows - 删除匹配正则表达式的文件

scala - Intellij IDEA 13 : Error compiling sbt component

scala - 如何在 Scala for 循环中指定一个 'next' 函数

python - 如何在循环中使用 os.fork() 调用不同的函数?

c++ - Trilinos稀疏 block 矩阵异常内存消耗

regex - 从 Google 表格上的文本中提取特定数字?

c++ - 为什么正则表达式会阻止替换?

eclipse - java.lang.NoSuchMethodError : main when starting HelloWorld with Eclipse Scala plugin

c - 如何在C中并行填充数组