如何使用可伸缩的解决方案从java中的一个非常大的文件中找到唯一的记录?

如何使用可伸缩的解决方案从java中的一个非常大的文件中找到唯一的记录?,java,file,collections,duplicates,scalability,Java,File,Collections,Duplicates,Scalability,我有一个文件(为了方便起见,可以说是csv文件),它可以包含多达数百万条记录。该文件可能包含多个重复项。假设我想查找唯一的记录,但只基于某些列(假设它们是主列)。假设我们有一个文件: 在此文件中,前两条记录不完全相同。但是如果我认为CulnN1是主要的,那么前2个记录对我来说是重复的(因为它们在CulnN1中有相同的值),而在最后的结果中我只想要1个。 在我当前的方法中,我使用一个映射,其中键值是我的主列数据,对应的映射值是整个记录。 通过这种方式,我迭代所有记录,对于每个记录,我分别将其主列

我有一个文件(为了方便起见,可以说是csv文件),它可以包含多达数百万条记录。该文件可能包含多个重复项。假设我想查找唯一的记录,但只基于某些列(假设它们是主列)。假设我们有一个文件:

在此文件中,前两条记录不完全相同。但是如果我认为CulnN1是主要的,那么前2个记录对我来说是重复的(因为它们在CulnN1中有相同的值),而在最后的结果中我只想要1个。

在我当前的方法中,我使用一个映射,其中键值是我的主列数据,对应的映射值是整个记录。 通过这种方式,我迭代所有记录,对于每个记录,我分别将其主列数据作为键值和整个记录作为映射值。这样,每当在迭代过程中遇到重复的主列时,它只会用相同的主键数据替换当前的记录(因为Map不允许重复)


虽然这种方法工作得很好,但我无法将其扩展到可能耗尽堆空间的更大文件。而且时间复杂度也不好。有谁能提出更好的方法吗?

您需要的是堆外数据结构。试试Hazelcast或Redis。否则,如果您不能使用其他任何东西,那么如果您只存储唯一记录的行号,并且在第二次尝试中写入输出,则可以大大降低内存需求。您还可以增加堆大小,甚至超过物理内存,但交换会降低性能。如果这还不够,您需要编写自己的堆外代码。您可以使用ByteBuffer.allocateDirect()分配内存,并在其中写入数据,然后使用映射来存储数据的偏移量。

为作业使用正确的工具-SQL、Hadoop等。这些数据不存储在任何数据库中,只能作为原始文件使用,因此SQL不是一个选项。不过,例如SQLite是一个文件,但它可以让你在上面运行查询,而且不需要任何安装抱歉没有让你明白…据我所知,SQLite是关系数据库,我在编写android东西时使用过它…但是我在这里如何使用SQLite?你可以在android中使用SQLite。基本上它是一个文件,所以你没有什么特别的事情要做。如果你愿意的话,我可以写一个关于如何做的完整答案。。