【问题标题】:How to sort multiple GB of data in different files?如何对不同文件中的多 GB 数据进行排序?
【发布时间】:2017-09-26 05:50:26
【问题描述】:

我有 50 个大约 10 GB 数字的文本文件。我必须对这些数字进行排序。我的第一个想法是使用应用合并排序,即分别对每个文件进行排序并合并它们。我正在使用数组来加载这些数字。当我运行应用程序时,我的程序由于内存不足而崩溃。所以我的问题是:

  1. 使用哪种数据结构?
  2. 如何管理内存?
  3. 合并排序方法是否正确?如果没有,请提出方法。

任何帮助将不胜感激。

【问题讨论】:

  • 这可能会有所帮助:stackoverflow.com/questions/4358087/…
  • 数字的最小值和最大值是多少?
  • 是的,事实上我创建了较小的文件并对其进行了排序。但我正在加载文件以合并它们然后我遇到了问题。
  • @samgak 我没有看到最大值,但数字最多为 7 位。最小值是 2 位数,但也可能是个位数,我也没有检查。
  • 您不会为了合并它们而将所有文件加载到内存中。相反,您从每个文件加载一个项目,找到最小的项目,然后输出它。然后你从一个来自的文件中加载一个项目并重新做一遍。这最好通过优先队列来完成。见stackoverflow.com/q/20802396/56778。或者,如果您有权访问Gnu sort utility,您可以让它对文件进行排序和合并。

标签: algorithm sorting out-of-memory mergesort


【解决方案1】:

如果数字最多只有 7 位并且是整数,那么您可以使用 Counting Sort。

您只需要大约 40Mb 的内存,即可存储 1000 万个 4 字节整数,计算 0-9,999,999 中每个数字的数量。如果您必须处理超过 21.4 亿个相同数字重复的可能性,那么您可以使用 64 位整数。将数组初始化为零,然后一次读取一个数字,更新每个数字的计数。完成后,您可以根据计数生成排序列表。

【讨论】:

  • 好的计数排序!我会检查的。但我不认为只有 1000 万个数字,因为我有 10 GB 的文件,所以我认为很多数字会重复很多次!
  • 如果最多只有 7 位数字,那么唯一数字不能超过 1000 万个。
  • 1 获取此信息。我会检查并回复你。看起来它会解决我的问题。
  • (您可能至少需要检查计数溢出:每个短数字字符串有 2+1 个“文本字节”,5*10^11 相当于四个字节无法计算的数字。)
猜你喜欢
  • 1970-01-01
  • 2018-05-08
  • 2014-10-10
  • 2014-07-20
  • 2023-02-24
  • 2019-11-19
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多