Scala:以高效的方式编写String Iterator文件

时间:2013-11-06 05:40:43

标签: performance scala optimization file-io

我有数千个文件(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行)。

2 个答案:

答案 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的操作。它将一次评估一行并编写它。