用PHP处理大文件

时间:2013-10-22 10:34:44

标签: php sorting large-files file-handling

我有一个大小约为10 GB或更多的文件。该文件只包含每行1到10之间的数字,而不包含任何其他数字。现在的任务是从文件中读取数据[数字],然后按升序或降序对数字进行排序,并创建一个包含已排序数字的新文件。

有人可以帮我解答一下吗?

3 个答案:

答案 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`;

?>

:)