当前位置: 首页 > 知识库问答 >
问题:

超大规模数据的重复检测

许胡非
2023-03-14

我对Java非常陌生,所以如果我做了一些非常错误的事情,请原谅我。

我在一个项目中工作,我需要快速扫描大量的数据(CSV有5000万行或更多,每行5个条目)重复。我使用了hashmap,因为它的.contains()方法速度很快。

共有1个答案

鲍向笛
2023-03-14

您在这里有很多选择,我将列出其中的一些:

>

  • 更多的内存:听起来您已经尝试给Java更多的内存,但是如果没有,那么使用-xmx编译器标志-例如Dimitry建议的-xmx3g将给您提供3GB的堆,而默认值为<=1GB.
  • 存储更少的数据:您当前存储的是“1到100个条目”的整行,而实际上我们所需要的只是知道数据是否唯一。arrays.hashcode()函数为您提供了一个相当准确的指示,表明一行在单个int中是唯一的,因此我们可以使用它来限制内存中需要保存的数据量:

    >

  • 构造两个hashset 对象,称为seenseentwice。循环您的数据,并将每个数组的哈希添加到seen,如果它已经在seen中,则添加到seentwice,如下所示:

    int[] arr = ... // construct the row's array
    int hash = Arrays.hashCode(arr);
    if(!seen.add(hash)) {
      // add returns false if we've already seen this hash
      seenTwice.add(hash);
    }
    

    现在我们有一组散列,我们看到了两次或更多次;理论上,这将是一个比我们文件中的行数小得多的集合。我们可以让seened收集垃圾,并使用seentwice重新读取文件,以填充实际数据的hashset ,就像您第一次尝试做的那样:

    int[] arr = ... // construct the row's array
    int hash = Arrays.hashCode(arr);
    if(seenTwice.contains(hash)) {
      // If the hash isn't in seenTwice, we know it's not a duplicate
      if(!rows.add(arr)) {
        System.out.println("Row "+Arrays.toString(arr))+" is a duplicate!");
      }
    }
    

    使用bash:如果您愿意放弃Java,您可以通过一个基本的bash命令非常容易地找到副本:

    cat filename | sort | uniq -d
    

    使用数据库:您可以使用一些内存不足的解决方案,特别是数据库。H2是一个好的、易于使用的Java数据库,但是使用它超出了本答案的范围。可以说,您可以将数据从文件加载到数据库中,然后简单地查询重复的行:在SQL表中查找重复的值

    另请参见:在csv文件中查找重复项的脚本

  •  类似资料:
    • 我有以下代码: 我要做的是检查文件是否在当前目录中。如果找不到,则创建该文件。 如果找到该文件,则在中下载spy ticker数据,并将该数据附加到中,并将其保存在csv文件中。 问题 我如何摆脱列,为什么会出现该列?

    • 校验者: @文谊 翻译者: @ゞFingヤ 对于一些应用程序,需要被处理的样本数量,特征数量(或两者)和/或速度这些对传统的方法而言非常具有挑战性。在这些情况下,scikit-learn 有许多你值得考虑的选项可以使你的系统规模化。 6.1. 使用外核学习实例进行拓展 外核(或者称作 “外部存储器”)学习是一种用于学习那些无法装进计算机主存储(RAM)的数据的技术。 这里描述了一种为了实现这一目的

    • 我在PHP(PDO)中遇到了这种情况; 我正在实现一个从MySql中检索数据的方法,并且做得很好,但问题是重复的数据恢复为关键骨,没有任何值,但其他数据附加更多,留下脚本和图像以了解更多细节; data.php 可变检验 json重复 预期结果

    • 在将数据从行编辑输入到QTableWidget后,如何使用数据库检查Tableview中的重复数据?

    • null 到目前为止,我已经: 其他简单的验证工作正常,但不能完成这个验证。有人能帮你提点主意吗?谢了!

    • 我使用Slim框架创建了一个PHP API。问题是,当我将API移动到新服务器时,我开始对响应产生问题。响应正文中的数据正在复制 例如,不要在响应中只获取一次: {data:[{用户名:'某人',密码:'某物'}]} 我明白了: {data:[{用户名:'某人',密码:'某物' }] } {data:[{用户名:'某人',密码:'某物' }] } {data:[{用户名:'某人',密码:'某物'}