c++ - 排序几乎已排序的大文件

标签 c++ algorithm sorting optimization

我面临着以下问题:

  • 我有一个巨大的文件(假设为 30 GB),它使用特定的 API 在内存中流式传输。

    • 此 API 仅允许我向前阅读(而不是向后阅读)。但是文件可以无限次读取。

    • 文件包含几乎所有排序的数据,如 99% 的数据已排序,但可能会发生记录不在正确位置的情况,如果所有内容都已排序,则记录应该早于插入.

我正在尝试创建此文件的拷贝,但需要对其进行排序。

有没有一种优雅的方式来做到这一点?

我能想到的唯一方法是最通用的方法:

  • 阅读文件
  • 创建一批几 GB 的内存,对它们进行排序,将它们写入 HDD 上的文件
  • 使用外部合并将所有这些临时文件合并到最终输出中

然而,这并没有使用数据“几乎”排序的特性。会有更好的方法吗?例如不使用 HDD 上的外部文件?

最佳答案

你可以这样做(Python 中的示例)

last = None
special = []
for r in records:
    if last is None or r > last:
        last = r
    else:
        special.append(r)
        if len(special) > max_memory:
            break
if len(special) > max_memory:
    # too many out of sequence records, use a regular sort
    ...
else:
    sort(special)
    i = 0
    for r in records:
        while i < len(special) and special[i] < r:
            write(special[i])
            i += 1
        write(r)
    while i < len(special):
        write(special[i])
        i += 1

关于c++ - 排序几乎已排序的大文件,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/29288110/

相关文章:

c++ - 到最近邻居的平均距离的近似值?

algorithm - 如何将字符串拆分成尽可能少的回文?

python - Pandas :在数据框中重新分配值

c++ - 使用 stringstream 而不是 `sscanf` 来解析固定格式的字符串

c++ - 如何将字符串从 C# 传递到 C++ 并指定编码

python - 快速搜索两个列表中的所有元素

javascript - angularJs 将表项目索引向上或向下移动

c++ - 我可以在类头文件中定义类的 const static 实例吗

c++ - Autotools 和 OpenSSL MD5/RAND_bytes 未定义

javascript - GmailApp、getDate 和排序