从数据集创建一个非常大的唯一列表以适应内存

时间:2011-01-05 08:23:22

标签: c# .net hashset

我有一个包含1.2亿条记录的列表,每条记录大约有40/50字节,大约是5.5 / 6千兆字节的原始内存空间,不包括将数组保存在内存中所需的任何额外存储空间。

我想确保此列表是唯一的。我尝试这样做的方法是创建一个Hashset< string>并逐一添加所有条目。

当我获得大约3300万条记录时,我的内存不足,而且列表创建速度变慢了。

有没有更好的方法及时对这个庞大的条目列表进行排序?我能想到的唯一解决方案是使用Amazon EC2高内存四倍超大型实例一小时。

由于

3 个答案:

答案 0 :(得分:6)

如果您只是想检查唯一性,我只需将输入序列拆分为存储桶,然后分别检查每个存储桶。

例如,假设您正在从文件加载数据,您可以将输入流入,并将其写入26个不同的文件,每个文件对应一个记录开头的字母(我天真地假设每个记录开始与AZ - 请根据您的实际情况调整)。然后,您可以使用类似现有代码的内容检查每个较小的文件的唯一性 - 因为它们中的任何一个都不会太大而无法一次装入内存。最初的分组保证不会有任何重复的条目存在于不同的桶中。

当然,您可以通过各种不同的方式执行分段,不同的方法对不同的数据集也有效。例如,您可以通过哈希代码进行存储 - 使用哈希代码的底部5位来创建32个不同的存储桶。这可能会在存储桶之间获得合理相等的记录分布,并且不会对输入数据做出任何假设。我只提到了上面的“采取第一个字母的方法”,因为它是一种更简单的方法来理解这个概念:)

答案 1 :(得分:4)

使用bucket sort对列表进行排序,定期将存储桶中的部分内容刷新到磁盘,以避免内存不足。然后按顺序加载每个刷新的桶,并使用您的HashSet方法或对其进行排序并以此方式检查。

答案 2 :(得分:-1)

您可以始终在具有唯一索引的sqlite数据库中工作,因为它可能有助于对数据集进行进一步处理。