【问题标题】:Creating a unique list from dataset too big to fit in memory从太大而无法放入内存的数据集创建唯一列表
【发布时间】:2011-01-05 08:23:22
【问题描述】:

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

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

当我达到大约 3300 万条记录时,我的内存不足,列表创建速度变慢。

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

谢谢

【问题讨论】:

  • 您存储的这个数据集在哪里?

标签: c# .net hashset


【解决方案1】:

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

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

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

【讨论】:

  • 感谢 Jon 和 Amber,这是一个没有想到的很棒的解决方案。
【解决方案2】:

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

【讨论】:

    【解决方案3】:

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

    【讨论】:

      猜你喜欢
      • 2020-11-24
      • 1970-01-01
      • 1970-01-01
      • 2015-11-18
      • 2014-01-08
      • 2019-01-13
      • 2021-11-01
      • 2011-09-09
      • 1970-01-01
      相关资源
      最近更新 更多