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