C:对大数据进行排序;不在记忆中
Posted
技术标签:
【中文标题】C:对大数据进行排序;不在记忆中【英文标题】:C: Sorting Big Data; Not in Memory 【发布时间】:2014-09-12 23:12:38 【问题描述】:我正在学习处理大量数据。
我生成了一个包含 10,000,000 个整数的文件。我想对数据执行多种排序并为排序计时(也许绘制性能分析的值?)但我以前从未使用过大数据并且不知道如何排序(比如说,甚至是冒泡排序! ) 不在内存中的数据!我想像这样调用程序:
./mySort < myDataFile > myOutFile
如何对无法放入链表或数组的数据进行排序?
【问题讨论】:
读入内存,排序,然后再写出来。 当两个int
值不在主内存中时,您的 CPU 甚至无法比较它们。在对数据进行排序之前,您绝对需要将数据放入内存中。
使用归并排序算法。
我打赌这里需要解决的“大数据”问题是在列表同时无法全部放入内存时对列表进行排序。否则,是的,以前的 cmets 有意义。
致所有对此发表评论的人:在某些情况下,您需要一种磁盘感知排序方法。如果文件是 1TB 怎么办?尽管对于许多系统来说 10,000,000 个整数可能不是很多,但用户可能对某些架构有一些限制。除非您还包括对实际问题的答案以及此提示,否则说“只是记住它”并没有真正的帮助。
【参考方案1】:
有多种算法可用于执行此类操作。它们都属于External Sorting 的总标题。
Donald Knuth 对磁带分类算法的处理是关于这方面的最佳参考之一,尽管技术性和密集性相当高。过去,数据存储在磁带上,只能按顺序读取,然后写入其他磁带,这种排序通常是通过在不同的磁带驱动器之间反复来回移动数据来完成的。
根据您使用的数据集的大小和类型,可能值得使用专用数据库将数据加载到其中,或者使用基于云的服务,如 Google's BigQuery。 BigQuery 上传和下载数据集无需任何费用,您只需为处理付费。每个月处理的第一 TB 数据是免费的,而您的数据甚至不到 1 GB。
编辑:这是一组非常好的undergraduate lecture notes 关于外部排序算法。 http://www.math-cs.gordon.edu/courses/cs321/lectures/external_sorting.html
【讨论】:
【参考方案2】:你需要使用外部排序
一次取一部分数据,在内存中排序,然后合并
这里有更多细节
http://en.m.wikipedia.org/wiki/External_sorting
【讨论】:
以上是关于C:对大数据进行排序;不在记忆中的主要内容,如果未能解决你的问题,请参考以下文章