我有一个大小约为10 GB或更多的文件。该文件只包含每行1到10之间的数字,而不包含任何其他数字。现在的任务是从文件中读取数据[数字],然后按升序或降序对数字进行排序,并创建一个包含已排序数字的新文件。
有人可以帮我解答一下吗?
答案 0 :(得分:1)
我认为这是一些家庭作业,目标是分配比RAM中更多的数据?
由于您只有数字1-10,因此这不是一项复杂的任务。只需打开您的输入文件,并计算您拥有的每个特定数字的数量。之后,您可以构造简单的循环并将值写入另一个文件。以下示例非常自我解释。
$inFile = '/path/to/input/file';
$outFile = '/path/to/output/file';
$input = fopen($inFile, 'r');
if ($input === false) {
throw new Exception('Unable to open: ' . $inFile);
}
//$map will be array with size of 10, filled with 0-s
$map = array_fill(1, 10, 0);
//Read file line by line and count how many of each specific number you have
while (!feof($input)) {
$int = (int) fgets($input);
$map[$int]++;
}
fclose($input);
$output = fopen($outFile, 'w');
if ($output === false) {
throw new Exception('Unable to open: ' . $outFile);
}
/*
* Reverse array if you need to change direction between
* ascending and descending order
*/
//$map = array_reverse($map);
//Write values into your output file
foreach ($map AS $number => $count) {
$string = ((string) $number) . PHP_EOL;
for ($i = 0; $i < $count; $i++) {
fwrite($output, $string);
}
}
fclose($output);
考虑到你正在处理大文件的事实,你还应该检查你的PHP环境的脚本执行时间限制,下面的例子对于10GB +大小的文件将花费很长时间,但是因为我没有看到任何限制关于你问题中的执行时间和表现,我认为没问题。
答案 1 :(得分:0)
之前我遇到过类似的问题。试图操纵如此庞大的文件最终导致资源大量流失,无法应对。我最终得到的最简单的解决方案是尝试使用名为LOAD DATA INFILE
的快速数据转储函数将其导入MySQL数据库
http://dev.mysql.com/doc/refman/5.1/en/load-data.html
一旦它进入你应该能够操纵数据。
或者,您可以逐行读取文件,同时将结果输出到另一个文件中,逐行排序。不太确定这会有多好用。
您之前是否有任何尝试,或者您是否只是采用了可能的方法?
答案 2 :(得分:0)
如果这就是你不需要PHP(如果你手头有一台Linux机器人):
sort -n file > file_sorted-asc
sort -nr file > file_sorted-desc
编辑:好的,这是你的PHP解决方案(如果你手头有一台Linux机器人):
<?php
// Sort ascending
`sort -n file > file_sorted-asc`;
// Sort descending
`sort -nr file > file_sorted-desc`;
?>
:)