大容量のファイルはマージソート

//大文件排序
	関数countsLines($パス){ 
		$ FD =のfopen($パス、 "R"); 
		$合計= 0; 
		しばらく(!feofを($ FD)){ 
			$合計++; 
			関数fgets($ FD); 
		} 
		$の合計を返します。
	} 
	$ filePathに= "./file.dat"。
	関数checkFiles($パス、$行= 5000){ 
		$ totalFiles = countsLines($パス)。
		$ totalFiles = CEIL($ totalFiles / $行)。
		$ファイル= []; 
		$ FD =のfopen($パス、 "R"); 
		用($ i = 1; $ I <= $ totalFiles; $ I ++){ 
			$ fileNameに= $ I "DAT"; 
			$ファイル[] = $ファイル名; 
			$ SD =のfopen($ fileNameに、 "W +"); 
			$ J = 1; 
			しばらく(!feofを($ FD)&& $ J <= $行){ 
				fputs($ SD、関数fgets($ FD));
			}
			fcloseを($のSD)。
		} 
		FCLOSE($ FD)。
		$ファイルを返します。
	} 
	関数cSort($ファイル){ 
		foreachの($ファイル$キー=> $ファイルとして){ 
			$コンテンツ=ファイル($ファイル)。
			$コンテンツ= array_mapを(関数($値){ 
				リターントリム($値); 
			}、$コンテンツ)。
			ソート($コンテンツ)。
			$ FD =のfopen($ファイル、 "W +"); 
			foreachの($キーとして$コンテンツ=> $値){ 
				$値= $ value.PHP_EOL。
				fputs($ FD、$値); 
			} 
		} 
	} 
	//合并数组
	関数mergeAllData($ファイル){ 
		(1>カウント($ファイル))、一方、{ 
			$ fname1 = array_shift($ファイル)。
			$ fname2 = array_shift($ファイル);
			$ newFileName = str_replace( ""、$ fname1。 "DAT")、 " - "(DAT " ""、$ fname2。)str_replace。"; "DAT"。
			$ FD1 =のfopen($ fname1、 "R"); 
			$ FD2 =のfopen($ fname2、 "R"); 
			$ FD3 =のfopen($ newFileName、 "W +"); 

			$ LINE1 = fgetsの($ FD1)。
			$ LINE2 = fgetsの($ FD2)。
			一方、(TRUE){ 
				$ LINE1 = INTVAL($ LINE1)。
				$ LINE2 = INTVAL($ LINE2)。
				IF($ LINE1 <$ LINE2){ 
					fputs($ FD3、$ line1.PHP_EOL)。
					$ LINE1 = fgetsの($ FD1)。
					もし(FEOF($ FD1)==真|| $ LINE1 === ""){ 
						fputs($ FD3、$ line2.PHP_EOL)。
						ブレーク; 
					} 
				}他{ 
					fputs($ FD3、$ line2.PHP_EOL)。
					もし(FEOF($ FD2)==真|| $ LINE2 === ""){ 
	cSort($ファイル);
						fputs($ FD3、$ line1.PHP_EOL)。
						ブレーク; 
					} 

				}	 
			} 
			(FEOF($ FD1)!)一方、{ 
				$ STR =関数fgets($ FD1)。
				(!$ strの= ""){もし
					fputs($ FD3、$ strの); 
				} 
			} 
			ながら(!FEOF($ FD2)){ 
				$ STR =関数fgets($ FD2)。
				(!$ strの= ""){もし
					fputs($ FD3、$ strの); 
				} 
			} 
			FCLOSE($ FD1)。
			fcloseを($ FD2)。
			fcloseを($ FD3)。
			($ファイル、$ newFileName)をするarray_unshift。
		} 
		
	} 
	//切割
	$ファイル= checkFiles($ filePathに); 
	//合并
	mergeAllData($ファイル);

  

おすすめ

転載: www.cnblogs.com/zh718594493/p/12089477.html