我有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
注意:我不允许使用排序和合并等内置函数。
答案 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