100G 数据,只有 100M 内存,怎么排序?
Posted 程序员大宝(coder-dabao)
tags:
篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了100G 数据,只有 100M 内存,怎么排序?相关的知识,希望对你有一定的参考价值。
100G 数据,按照 100M 内存拆分,然后排序有序的数据,然后写入到 file1,file2…file100。
多路归并。
第一回合:
从 file1,file2,file3…file100.取出第一个数。及最小的。所有的初始指针都是第一行。
m
i
n
1
=
m
i
n
(
min1 = min(
min1=min(fil1,$file2,file3…file100);
m
i
n
1
写
入
到
大
数
据
文
件
。
大
数
据
行
数
指
针
+
1
。
min1 写入到大数据文件。大数据行数指针+1。
min1写入到大数据文件。大数据行数指针+1。min1 对应的行数指针+1。
第二回合:
从 file1,file2,file3…file100.取出第一个数。及最小的。所有的初始指针都是第一行。
m
i
n
2
=
m
i
n
(
min2 = min(
min2=min(fil1,$file2,file3…file100);
m
i
n
2
写
入
到
大
数
据
文
件
。
大
数
据
行
数
指
针
+
1
。
min2 写入到大数据文件。大数据行数指针+1。
min2写入到大数据文件。大数据行数指针+1。min2 对应的行数指针+1。
多路归并排序:
function mergeMultiArray($arr)
//初始化参赛 PK 的数据
40
foreach($arr as $key => $items)
//初始化每个参赛的第一个元素
$idx[$key] = 0;
$retArr = array();
$retIdx = 0;
while(false == empty($arr))
$min = null;//最小值
$minKey = null;//最小值得代表队编号
foreach($arr as $key => $items)
$tmpIdx = $idx[$key];//参赛代表对当前指针
$tmpMin = $items[$tmpIdx];//参赛代表对的值
$tmpKey = $key;//参赛代表对的编号
if(null == $min || $tmpMin < $min)
$min = $tmpMin;
$minKey = $key;
//写入结果
$retArr[$retIdx] = $min;
$retIdx++;
//或者队伍的指针+1
$idx[$minKey]++;
//参赛代表队,队员已经用完了
if($idx[$minKey] >= count($arr[$minKey]))
unset($arr[$minKey]);
return $retArr;
$ret = mergeMultiArray(array(array(1,10,100),array(2,30,70),array(4,6,9)));
print_r($ret);
技术交流
CleverCode是一名架构师,技术交流,咨询问题,请加CleverCode创建的qq群(架构师俱乐部):517133582。加群和腾讯,阿里,百度,新浪等公司的架构师交流。【架构师俱乐部】宗旨:帮助你成长为架构师!
以上是关于100G 数据,只有 100M 内存,怎么排序?的主要内容,如果未能解决你的问题,请参考以下文章