大文件归并排序

//大文件排序
	function countsLines($path){
		$fd = fopen($path,"r");
		$total=0;
		while(!feof($fd)){
			$total++;
			fgets($fd);
		}
		return $total;
	}
	$filePath = "./file.dat";
	function checkFiles($path,$rows=5000){
		$totalFiles = countsLines($path);
		$totalFiles=ceil($totalFiles/$rows);
		$files=[];
		$fd=fopen($path,"r");
		for($i=1;$i<=$totalFiles;$i++){
			$fileName=$i.".dat";
			$files[]=$fileName;
			$sd = fopen($fileName,"w+");
			$j=1;
			while(!feof($fd) && $j <= $rows){
				fputs($sd,fgets($fd));
				$j++;
			}
			fclose($sd);
		}
		fclose($fd);
		return $files;
	}
	function cSort($files){
		foreach ($files as $key => $file) {
			$content = file($file);
			$content = array_map(function($value){
				return trim($value);
			},$content);
			sort($content);
			$fd = fopen($file,"w+");
			foreach ($content as $key => $value) {
				$value=$value.PHP_EOL;
				fputs($fd,$value);
			}
		}
	}
	//合并数组
	function mergeAllData($files){
		while(count($files) > 1){
			$fname1 = array_shift($files);
			$fname2 = array_shift($files);
			$newFileName = str_replace(".dat","", $fname1)."-".str_replace(".dat","",$fname2).".dat";
			$fd1=  fopen($fname1,"r");
			$fd2 = fopen($fname2,"r");
			$fd3 = fopen($newFileName,"w+");

			$line1 = fgets($fd1);
			$line2 = fgets($fd2);
			while(true){
				$line1 = intval($line1);
				$line2 = intval($line2);
				if($line1 < $line2){
					fputs($fd3,$line1.PHP_EOL);
					$line1 = fgets($fd1);
					if(feof($fd1)==true  || $line1 ===""){
						fputs($fd3,$line2.PHP_EOL);
						break;
					}
				}else{
					fputs($fd3,$line2.PHP_EOL);
					$line2=fgets($fd2);
					if(feof($fd2)==true || $line2 === ""){
						fputs($fd3,$line1.PHP_EOL);
						break;
					}

				}
			}
			while(!feof($fd1)){
				$str =fgets($fd1);
				if($str != ""){
					fputs($fd3,$str);
				}
			}
			while(!feof($fd2)){
				$str =fgets($fd2);
				if($str != ""){
					fputs($fd3,$str);
				}
			}
			fclose($fd1);
			fclose($fd2);
			fclose($fd3);
			array_unshift($files, $newFileName);
		}

	}
	//切割
	$files = checkFiles($filePath);
	//合并
	cSort($files);
	mergeAllData($files);

  

原文地址:https://www.cnblogs.com/zh718594493/p/12089477.html

时间: 2024-10-13 16:23:47

大文件归并排序的相关文章

大文件,5亿整数,怎么排?

问题 给你1个文件bigdata,大小4663M,5亿个数,文件中的数据随机,如下一行一个整数: 6196302 3557681 6121580 2039345 2095006 1746773 7934312 2016371 7123302 8790171 2966901 ... 7005375 现在要对这个文件进行排序,怎么搞? 内部排序 先尝试内排,选2种排序方式: 3路快排: private final int cutoff = 8; public <T> void perform(Co

【学习】大文件统计与排序(转载)

学习:大文件统计与排序 这篇主要记录一下学习陈硕同学的对下面这道题的算法思想与代码. 题目是这样的: 有10个文件,每个文件1G,每个文件的每行存放的都是用户的query(请自己随机产生),每个文件的query都可能重复.要求你按照query的频度排序. (当然,这里的重点是大文件,所以10个1G的文件,或者1个10G的文件,原理都是一样的) 陈硕的代码在这里: https://gist.github.com/4009225 这是一段非常漂亮的代码,解法与代码都非常值得一看. [解法] 基本步骤

对大文件排序

设想你有一个20GB的文件,每行一个字符串,说明如何对这个文件进行排序. 内存肯定没有20GB大,所以不可能采用传统排序法.但是可以将文件分成许多块,每块xMB,针对每个快各自进行排序,存回文件系统. 然后将这些块逐一合并,最终得到全部排好序的文件. 外排序的一个例子是外归并排序(External merge sort),它读入一些能放在内存内的数据量,在内存中排序后输出为一个顺串(即是内部数据有序的临时文件),处理完所有的数据后再进行归并.[1][2]比如,要对900MB的数据进行排序,但机器

GitHub限制上传大于100M的单个大文件

工作中遇到这个问题,一些美术资源..unitypackage文件大于100M,Push到GitHub时被拒绝.意思是Push到GitHub的每个文件的大小都要求小于100M. 搜了一下,很多解决办法只是把这些超过100M的大文件从本地版本库中移除,使得Push可以成功.但这并没有解决如何上传大文件到GitHub的问题. 解决办法是使用Git LFS. 用法参考:http://blog.csdn.net/tyro_java/article/details/53440666 按照以上方法设置好后,就

split、rar拆分大文件

split拆分大文件 系统默认自带有 # split -b 2048m aa aa_ -b n[bkm]  b代表512b,k代表1KB,m代表1M 后面aa表示指定文件前缀 结果为:aa_aa aa_ab 合并拆分文件: # cat aa_aa aa_ab > aa rar拆分大文件 # apt-get install rar # rar a -v2048m aa.rar aa 结果为:aa.part1.rar aa.part2.rar 合并并解压: # unrar aa.part1.rar

WebUploader插件上传大文件单文件和多文件JAVA版使用总结

一.使用webuploader插件的原因说明 被现在做的项目坑了. 先说一下我的项目架构Spring+struts2+mybatis+mysql 然后呢.之前说好的按照2G上传就可以了,于是乎,用了ajaxFileUpload插件,因为之前用图片上传也是用这个,所以上传附件的时候就直接拿来用了 各种码代码,测试也测过了,2G文件上传没问题,坑来了,项目上线后,客户又要求上传4G文件,甚至还有20G以上的..纳尼,你不早说哦... 在IE11下用ajaxFileUpload.js插件上传超过4G的

HTML5 大文件上传示例

<!DOCTYPE html> <html> <head> <meta charset="utf-8"> <title>HTML5大文件分片上传</title> <script src="js/spark-md5.min.js" type="text/javascript" charset="utf-8"></script> <

win10 大文件 安卓android studio修改 汉化

韩梦飞沙  韩亚飞  [email protected]  yue31313  han_meng_fei_sha ========== win10 大文件 gradle-3.3-all 这个里面有 大量重复的, 这应该我们 配置有问题,这些可以复用的. 然而每个项目自己都创建了一个.应该修改一下. ==== 修改 设置 插件 名字 目录 C:\Users\Administrator\.AndroidStudio2.3\config\plugins  修改相应文件 我们 自己下载的插件 会存放到这

解决MOFH免费空间cpanel面板大文件无法解压的情况

解决办法: 解压大文件,重新压缩为tar格式的压缩格式,这样可以更小,而且也可以在cpanel面板解压,记得使用filezilla软件上传文件,在cpanel的网页界面不要刷新,一刷新就不可以解压大文件tar格式了,会提示"Files which are too big can't be downloaded, uploaded, copied, moved, searched, zipped, unzipped, viewed or edited; they can only be renam