加入收藏 | 设为首页 | 会员中心 | 我要投稿 李大同 (https://www.lidatong.com.cn/)- 科技、建站、经验、云计算、5G、大数据,站长网!
当前位置: 首页 > 大数据 > 正文

如何使用4GB RAM提取文件> 10 GB的唯一行

发布时间:2020-12-14 04:33:44 所属栏目:大数据 来源:网络整理
导读:我有一台4 GB内存的PC和一个内存使用量为10 GB的文件.现在我想检查一下,如果文件中的每一行都是唯一的,那么我编写了以下代码: import java.io.BufferedReader;import java.io.File;import java.io.FileReader;import java.io.FileWriter;import java.io.IOE
我有一台4 GB内存的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所以我的问题是:
我应该如何更改代码以获取每行唯一的文件?
提前谢谢你的帮助.

解决方法

您可以尝试首先查找重复的线条哈希以识别潜在的重复线条:

Map<Integer,Integer> hashes = new HashMap<> ();
Map<Integer,Integer> dupes = new HashMap<> ();
int i = 0;
while ((line = buff.readLine()) != null) {
  int hash = line.hashCode();
  Integer previous = hashes.get(hash);
  if (previous != null) { //potential duplicate
    dupes.put(i,previous);
  } else {
    hashes.put(hash,i);
  }
  ++i;
}

最后,您有一个潜在的重复列表.如果dupes是空的,则没有重复,如果不是,那么你可以对文件进行第二次传递以检查这些行是否真的相同.

(编辑:李大同)

【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容!

    推荐文章
      热点阅读