繁体   English   中英

使用序列化二叉搜索树对海量数据进行排序

[英]Sorting huge volumed data using Serialized Binary Search Tree

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

3633223656935182015 2473242774832902432
8472954724347873710 8197031537762113360
2436941118228099529 7438724021973510085
3370171830426105971 6928935600176631582
3370171830426105971 5928936601176631564

我需要以该键的最小值按递增顺序将此数据排序为键。 结果必须在 30 分钟内呈现在另一个文本文件 (data.out) 中。 例如,对于上面的示例,结果必须是这样的;

2436941118228099529 7438724021973510085
3370171830426105971 5928936601176631564
3633223656935182015 2473242774832902432
8472954724347873710 8197031537762113360

我决定了;

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

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

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

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

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

OS: Linux
Language: C
RAM: 6 GB

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

考虑到您的文件似乎具有大约 40 个字符的相同行大小,总共给我大约 1250000000 行,我将通过以下命令将输入​​文件拆分成更小的文件:

split -l 2500000 biginput.txt

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

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

最后我将它们合并

sort -m sx* > bigoutput.txt

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM