在大文件中搜索关键字(Java/Scala)

在大文件中搜索关键字(Java/Scala),java,scala,Java,Scala,我有一个120MB的大文件,其中包含UTF8编码的字符串,我需要在这个文件中搜索某些单词 文件的格式如下所示: [resource][resource][resource]…将大括号作为一行,这样我可以快速地将其读入内存。 我只在标签中搜索并返回标签和资源,其中标签包含一个或多个关键字。标签和关键字都是小写的 目前,我加载整个文件并创建一个字符串列表。此列表中的每个条目都包含一对资源和标签,格式为[resource]。这个名单的规模大约是300万。我用一个尾部递归函数“迭代”这个列表,看看我的标

我有一个120MB的大文件,其中包含UTF8编码的字符串,我需要在这个文件中搜索某些单词

文件的格式如下所示:
[resource][resource][resource]…
将大括号作为一行,这样我可以快速地将其读入内存。 我只在标签中搜索并返回标签和资源,其中标签包含一个或多个关键字。标签和关键字都是小写的

目前,我加载整个文件并创建一个字符串列表。此列表中的每个条目都包含一对资源和标签,格式为
[resource]
。这个名单的规模大约是300万。我用一个尾部递归函数“迭代”这个列表,看看我的标签是否包含一个关键字。这相当快 案例a::as=>{ val found=keyWords.foldRight(List.empty[(字符串,字符串)]){(x,y)=> 如果(a)包含(x)){
val split=a.split(“您不需要每次搜索元素时都重新分析文件

把你的文件读一遍,然后把单词放在
Map[String,Set[String]]

比如:

val allWords: Map[String, Seq[String]] = 
  Source.fromFile(file)
        .getLines()
        .head
        .split(extractLabelResources)
        .groupBy { case (label, resource) => label }
        .mapValues(_.toSeq)

def extractLabelResources(line: String): Array[(String, String)] = {
    // ...
}

def search(word: String): Set[String] = allWords.getOrElse(word, Set.empty)

你说你在800毫秒,比2秒还小,那么这里的问题是什么?
val allWords: Map[String, Seq[String]] = 
  Source.fromFile(file)
        .getLines()
        .head
        .split(extractLabelResources)
        .groupBy { case (label, resource) => label }
        .mapValues(_.toSeq)

def extractLabelResources(line: String): Array[(String, String)] = {
    // ...
}

def search(word: String): Set[String] = allWords.getOrElse(word, Set.empty)