我想从文本文件中删除重复的字符串。为此,我将每一行放入HashSet中,然后将它们写入另一个文件中。而且效果很好。但是,当涉及到大文件(180mb 500万行)时,它不能很好地工作。假设不可能在HashSet或任何其他集合中存储500万个字符串,我做了一个循环,所以我存储了前100000行,然后将它们写到文件中,然后再次清除HashSet并写到那里文件中没有更多行。不幸的是,这不会删除所有重复项,但我认为它可以删除大约70-90%。但这是行不通的。当我用180mb文件测试500万行时。我计算出约30万个重复项,新文件有约300万行。它应该有大约500万到30万。当我计算迭代次数时,它们应该是500万,但是是3,400万。
public File removeDuplicates(File file) {
System.out.println("file opened");
Scanner sc;
HashSet<String> set = new HashSet<String>();
JFileChooser chooser = new JFileChooser();
File createdFile = null;
int returnVal = chooser.showSaveDialog(parent);
if (returnVal == JFileChooser.APPROVE_OPTION) {
BufferedWriter bufferedWriter = null;
createdFile = chooser.getSelectedFile();
try {
if (!createdFile.exists()) {
createdFile.createNewFile();
}
}catch(Exception e) {
e.printStackTrace();
}
}
try {
sc = new Scanner(file);
boolean hasMore = true;
while (hasMore) {
hasMore = false;
while (sc.hasNextLine() && set.size() < PERIOD) {
set.add(sc.nextLine());
repeated++;
}
createdFile = this.writeToFile(set,createdFile);
set.clear();
hasMore = true;
if (sc.hasNextLine() == false)
hasMore = false;
set.clear();
}
} catch (FileNotFoundException e) {
// TODO Auto-generated catch block
e.printStackTrace();
}
return createdFile;
}
private File writeToFile(HashSet<String> set, File f) {
BufferedWriter bufferedWriter = null;
try {
Writer writer = new FileWriter(f, true);
bufferedWriter = new BufferedWriter(writer);
for (String str : set) {
bufferedWriter.write(str);
bufferedWriter.newLine();
}
} catch (Exception e) {
e.printStackTrace();
}finally {
if (bufferedWriter != null)
try {
bufferedWriter.close();
} catch (IOException e) {
e.printStackTrace();
}
}
return f;
}
重复的是计算迭代次数的变量。 是代码产生的还是RAM消耗的?有什么办法可以使它起作用?