我有一些大的(比方说200 MiB - 2 GiB)文本文件充满了大量的重复记录。每行可以有大约100个甚至更多精确的重复文件分布在文件中。任务是删除所有重复,留下每个记录的唯一实例。为什么Scala写的线路重复数据删除应用程序很慢?
我如下实现它:
object CleanFile {
def apply(s: String, t: String) {
import java.io.{PrintWriter, FileWriter, BufferedReader, FileReader}
println("Reading " + s + "...")
var linesRead = 0
val lines = new scala.collection.mutable.ArrayBuffer[String]()
val fr = new FileReader(s)
val br = new BufferedReader(fr)
var rl = ""
while (rl != null) {
rl = br.readLine()
if (!lines.contains(rl))
lines += rl
linesRead += 1
if (linesRead > 0 && linesRead % 100000 == 0)
println(linesRead + " lines read, " + lines.length + " unique found.")
}
br.close()
fr.close()
println(linesRead + " lines read, " + lines.length + " unique found.")
println("Writing " + t + "...")
val fw = new FileWriter(t);
val pw = new PrintWriter(fw);
lines.foreach(line => pw.println(line))
pw.close()
fw.close()
}
}
它需要15分钟(在我的Core 2 Duo处理器,4 GB RAM)来处理92 MIB文件。虽然下面的命令:
awk '!seen[$0]++' filename
需要大约一分钟来处理1.1吉布文件(这将需要许多小时以矿的上面的代码)。
我的代码有什么问题?
尝试使用散列而不是该ArrayBuffer。 – Mat 2012-01-28 11:56:15