我有一个包含1.2亿条记录的列表,每条记录大约有40/50字节,大约是5.5 / 6千兆字节的原始内存空间,不包括将数组保存在内存中所需的任何额外存储空间。
我想确保此列表是唯一的。我尝试这样做的方法是创建一个Hashset< string>并逐一添加所有条目。
当我获得大约3300万条记录时,我的内存不足,而且列表创建速度变慢了。
有没有更好的方法及时对这个庞大的条目列表进行排序?我能想到的唯一解决方案是使用Amazon EC2高内存四倍超大型实例一小时。
由于
答案 0 :(得分:6)
如果您只是想检查唯一性,我只需将输入序列拆分为存储桶,然后分别检查每个存储桶。
例如,假设您正在从文件加载数据,您可以将输入流入,并将其写入26个不同的文件,每个文件对应一个记录开头的字母(我天真地假设每个记录开始与AZ - 请根据您的实际情况调整)。然后,您可以使用类似现有代码的内容检查每个较小的文件的唯一性 - 因为它们中的任何一个都不会太大而无法一次装入内存。最初的分组保证不会有任何重复的条目存在于不同的桶中。
当然,您可以通过各种不同的方式执行分段,不同的方法对不同的数据集也有效。例如,您可以通过哈希代码进行存储 - 使用哈希代码的底部5位来创建32个不同的存储桶。这可能会在存储桶之间获得合理相等的记录分布,并且不会对输入数据做出任何假设。我只提到了上面的“采取第一个字母的方法”,因为它是一种更简单的方法来理解这个概念:)
答案 1 :(得分:4)
使用bucket sort对列表进行排序,定期将存储桶中的部分内容刷新到磁盘,以避免内存不足。然后按顺序加载每个刷新的桶,并使用您的HashSet方法或对其进行排序并以此方式检查。
答案 2 :(得分:-1)
您可以始终在具有唯一索引的sqlite数据库中工作,因为它可能有助于对数据集进行进一步处理。