Regex 使用scala future的大文件的多个并行grep速度不如要求的快

Regex 使用scala future的大文件的多个并行grep速度不如要求的快,regex,scala,parallel-processing,akka,future,Regex,Scala,Parallel Processing,Akka,Future,我有一个相当大的文件(20-30MB)。我有一个映射,其中我有一个键和相应的regex作为值,我需要在文件中grep以获得键的实际值,并将新键、值存储在新映射中。这就是我的方法 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: (Str

我有一个相当大的文件(20-30MB)。我有一个映射,其中我有一个键和相应的regex作为值,我需要在文件中grep以获得键的实际值,并将新键、值存储在新映射中。这就是我的方法

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)
}
contextmap//初始映射,包含正则表达式形式的键和值
contextstrings//final map应该在grep之后有值
def fgrepfurture(e:(字符串,字符串))=未来{
val re=新正则表达式(e._2)
Source.fromFile(f).getLines.foreach{
重新找到FirstMatchin匹配{
案例无=>(“”,“”)
案例部分(x)=>(e._1,x.群(1))
}
}
}
val fg=未来。导线测量(tmpmap)(FGREPFOUTER)
fg未完成{
case tups=>for(t.t.toString.split(“,”).tail.head)
}

这里的问题是,当future完成我剩下的代码(基于akka actors的异步模型)时,我已经走得太远了,以至于我无法快速获得文件中的grepped值(我希望全局可用)。我需要快速获得值,但我不知道为什么这种方法不能提供给我(因为多个future并行工作),因此请指出缺陷。另外,如果有更好的方法从相当大的文件中获取多个值,请提出建议。

您可以确定程序中最远的点,如果达到该点,并且该功能不完整,请等待,w这是一个有限的好处,你可以同时做一些工作。 你可以做的另一件事是尝试以类似这样的并行方式grep

val chunkSize = 128 * 1024
val iterator = Source.fromFile(path).getLines.grouped(chunkSize)
iterator.foreach { lines => 
    lines.par.foreach { line => process(line) }
}

基于。

您可能在做并行工作,但似乎您所有的并行任务都在读取同一个文件,
f
。这显然会非常慢……甚至比只读取一次文件还要慢

IO总是一个瓶颈,并行性对此无能为力

您可以:

1) 只需对文件进行一次遍历,并在一次遍历中获取所有密钥

2) 将文件加载到内存中,然后让并行任务在该只读数据结构上工作


选项2)如果每个任务都完成了大量工作,则会很有用,但由于您只是在变灰,因此我会选择选项1)。

您可以使用等待方法?等待是否会阻止流程(我不想要)?但您暗示您的计算是基于之前的计算?是的,需要所有的grep来获取全局所需的键值,以便以后对整个文件进行解析。但我仍然严格要求所谓的预处理(所有grep)不应阻止流的其余部分。我需要遵守这一点。这是一个条款上的矛盾。感谢这对提高响应时间有很大帮助。