java - 在大规模数据上删除 java 中的重复项

标签 java

我有以下问题。 我正在使用 API 连接到某个地方,并将数据作为输入流获取。 目标是在删除重复行后保存数据。 由第 10、15、22 列定义的重复项。

我正在使用多个线程获取数据。 目前我首先将数据保存到一个 csv 文件中,然后删除重复项。 我想在读取数据时执行此操作。 数据量约为1000万条记录。 我可以使用的内存有限。 该机器有 32gb 的内存,但我的内存有限,因为还有其他应用程序正在使用它。

我在这里阅读了有关使用 HashMap 的信息。 但我不确定我是否有足够的内存来使用它。

有没有人建议如何解决这个问题?

最佳答案

Hashmap 将至少使用与原始数据一样多的内存。因此,它可能不适合您的数据集大小(但是,您应该检查一下,因为如果可行,这是最简单的选择)。

我会做的是将数据写入文件或数据库,为要删除重复的字段计算哈希值,然后将哈希值存储在内存中并适当引用文件(例如,原始值在书面文件中)。引用当然应该越小越好。

当您命中哈希匹配时,查找原始值并检查它是否相同(因为不同值的哈希可能会落在一起)。

现在的问题是您期望有多少重复项。如果您期望很少匹配,我会选择一种写入成本低而读取成本高的解决方案,即将所有内容线性转储到一个平面文件中,然后从该文件中读回。

如果您期望有很多匹配项,则可能是相反的方式,即有一个索引文件或一组文件,甚至是一个数据库(确保它是一个写操作不太昂贵的数据库)。

关于java - 在大规模数据上删除 java 中的重复项,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/40717681/

相关文章:

java - Camel仅在启动时发送消息,然后停止

java - 未调用 Jersey ExceptionMapper

java - 如何在内部 AsyncTask 类中从 doInBackground 调用外部类函数?

java - 这种嵌套映射结构对于多线程读取安全吗?

c# - 存储库模式缺少什么?你如何在现实世界中使用它?

java - 从一维像素数组中获取特定像素

Java 日历跳过第一个月

java - 在 Windows 计算机上使用 Java Swing SystemLookAndFeel 会导致带有 JTextPanes 的 CachedPainter 中出现内存泄漏

java - 在Java中,对象变量是否包含对象的地址?

java - 音频的停止和播放按钮 (Android)