【发布时间】:2015-11-04 21:02:31
【问题描述】:
我有一台具有 4 GB RAM 的 PC 和一个使用 10 GB 内存的文件。现在我想检查文件中的每一行是否都是唯一的,所以我编写了以下代码:
import java.io.BufferedReader;
import java.io.File;
import java.io.FileReader;
import java.io.FileWriter;
import java.io.IOException;
import java.util.HashSet;
import java.util.Set;
public class Cleaner {
public static void main(String[] args) throws IOException {
if (args.length < 2) {
System.out.println("Too less parameters!");
return;
}
File file = new File(args[0]);
BufferedReader buff = new BufferedReader(new FileReader(file));
String line;
Set<String> set = new HashSet<String>();
while ((line = buff.readLine()) != null) {
set.add(line);
}
FileWriter fw = new FileWriter(args[1]);
for (String s : set) {
fw.write(s + "\n");
fw.flush();
}
fw.close();
buff.close();
}
}
但我得到了 OutOfMemoryException,所以我的问题是:
我应该如何更改我的代码以获取每行都是唯一的文件?
提前感谢您的帮助。
【问题讨论】:
-
分割成块并比较成对。或者散列每一行,然后将散列与行一起存储。
-
散列的问题是每一行只是一个散列,我应该如何分块我可能会错过一些重复的行。
-
看看 RandomAccessFile,您可以从 RandomAccessFile 'a' 中读取第 1 行,并将其与 RandomAccessFile 'b' 的所有其他行进行比较。之后读取第 2 行,依此类推
-
我会选择
cat bigfile.txt | sort | uniq > uniq.txt,但这当然不是 Java 解决方案。 -
@LeonidGlanz 这可能会有所帮助stackoverflow.com/questions/9215820/…