我有数千个文件(50K),每个文件大约有10K行。我读取文件进行一些处理并将行写回输出文件。虽然我的读取和处理速度更快,但将String Iterator转换回单个String并将其写入文件的最后一步需要很长时间(几乎是一秒钟。我不会为此做数学处理整个人口的文件大约50K)。我认为这是改善解析时间的瓶颈。
这是我的代码。
var processedLines = linesFromGzip(new File(fileName)).map(line => MyFunction(line))
var outFile = Resource.fromFile(outFileName)
outFile.write(processedLines.mkString("\n")) // severe overhead caused by this line-> processedLines.mkString("\n")
(我在其他一些论坛/博客上看到mkString很多better than other approaches.(例如)
是否有更好的替代mkString(" \ n")?是否有一种完全不同的方法可以提高我处理文件的速度。 (记住,我有50K文件,每个文件接近10K行)。
答案 0 :(得分:4)
你重复这个操作2次:一次迭代字符串和mkString“\ n”,然后将这些行写入文件。相反,你可以一次性完成:
for(x <-processedLines){
outFile.write(x);
outFile.write("\n");
}
答案 1 :(得分:1)
由于您使用Iterator
,因此写作速度较慢。 Iterator
被懒惰地评估了。实际上,你的写作不是很慢,而是对Iteraor
的评价。 Iterator
被懒惰地评估了。这意味着它会在使用时进行评估。因为您要映射Iterator
的元素,所以会产生一个尚未评估的新Iterator
。在您致电mkString
时,会对其进行评估。此功能可将Iterator
转换为存储在RAM中的String
。为避免这种情况,我建议使用一个接受Iterator
的写函数,如Jatin建议的那样。您可以重写他的代码,如:
processedLines.foreach(line => {
outfile.write(line)
outfile.write("\n")
}
这实际上是对Iterator
的操作。它将一次评估一行并编写它。