2

我有数千个文件(50K),每个文件大约有 10K 行。我读取文件进行一些处理并将这些行写回输出文件。虽然我的阅读和处理速度更快,但将字符串迭代器转换回单个字符串并将其写入文件的最后一步需要很长时间(几乎一秒钟。我不会为整个过程做数学运算大约 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比其他方法好得多。(例如)

有没有更好的替代 mkString("\n") ?是否有一种完全不同的方法可以提高我处理文件的速度。(请记住,我有 50K 个文件,每个文件接近 10K 行)。

4

2 回答 2

4

好吧,您正在重复该操作 2 次:一次迭代字符串和 mkString "\n",然后将这些行写入文件。相反,您可以一口气完成:

for(x <-processedLines){
    outFile.write(x);
    outFile.write("\n");
}
于 2013-11-06T05:48:40.863 回答
1

您的写作速度较慢,因为您使用的是Iterator. Iterators 被懒惰地评估。其实慢的不是你的文笔,而是对Iteraor. AnIterator被懒惰地评估。这意味着它会在使用时进行评估。因为您正在映射您的元素,Iterator所以它会产生一个Iterator尚未评估的新元素。它会在您调用的那一刻进行评估mkString。此函数将您Iterator转换String为存储在 RAM 中的 . 为了避免这种情况,我建议使用接受IteratorJatin 建议的 write 函数。你可以像这样重写他的代码:

processedLines.foreach(line => {
  outfile.write(line)
  outfile.write("\n")
}

这实际上是对Iterator. 它将一次评估一行并写入。

于 2013-11-06T07:14:37.347 回答