从庞大的文本文件中删除重复的字符串

时间:2018-09-13 13:41:40

标签: java

我想从文本文件中删除重复的字符串。为此,我将每一行放入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消耗的?有什么办法可以使它起作用?

0 个答案:

没有答案