使用序列化二进制搜索树对巨大的数据进行排序

时间:2015-10-12 09:54:15

标签: c performance sorting serialization binary-search-tree

我有50 GB这样的结构(作为键/值)数据存储在一个文本文件中(input.txt / keys和值是63位无符号整数);

3633223656935182015 2473242774832902432
8472954724347873710 8197031537762113360
2436941118228099529 7438724021973510085
3370171830426105971 6928935600176631582
3370171830426105971 5928936601176631564

我需要使用该键的最小值按顺序对此数据进行排序。结果必须在30分钟内显示在另一个文本文件(data.out)中。例如,对于上面的示例,结果必须如此;

2436941118228099529 7438724021973510085
3370171830426105971 5928936601176631564
3633223656935182015 2473242774832902432
8472954724347873710 8197031537762113360

我决定了;

  • 我将创建一个BST树,其中包含input.txt中的键及其最小值,但此树将超过50GB。我的意思是,此时我有时间和内存限制。

  • 所以我将使用另一个文本文件(tree.txt),我将BST树序列化到该文件中。

  • 之后,我将使用按顺序遍历遍历树并将排序的数据写入data.out文件。

我的问题主要是序列化和反序列化部分。如何序列化此类数据?我想对序列化数据使用INSERT操作。因为我的数据比内存大。我无法在内存中执行此操作。实际上我想将文本文件用作内存。

顺便说一下,我对这种东西很新。如果与我的算法步骤有冲突,请警告我。任何想法,技术和代码示例都会有所帮助。

OS: Linux
Language: C
RAM: 6 GB

注意:我不允许使用排序和合并等内置函数。

1 个答案:

答案 0 :(得分:2)

考虑到你的文件似乎有大约40个字符的相同行大小,总共给我125,000000行,我通过命令将输入​​文件拆分为更小:

split -l 2500000 biginput.txt

然后我会对每个人进行排序

for f in x*; do sort -n $f > s$f; done

最后我将它们合并为

sort -m sx* > bigoutput.txt