我有一个大小约为10 GB或更大的文件。该文件每行只包含从1到10的数字,不包含其他任何内容。
你们谁能帮我解答这个问题?
发布于 2013-10-22 19:55:19
我假设这是某种家庭作业,其目标是排序超过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+大小的文件将花费很长的时间,但是由于我在你的问题中没有看到任何关于执行时间和性能的限制,我假设它是OK的。
发布于 2013-10-22 18:40:29
我以前也遇到过类似的问题。试图操作如此大的文件最终会消耗大量的资源,并且无法处理。我最终得到的最简单的解决方案是尝试使用名为LOAD DATA INFILE的快速数据转储函数将其导入MySQL数据库
http://dev.mysql.com/doc/refman/5.1/en/load-data.html
一旦它进入,你应该能够操作数据。
或者,您可以只逐行读取文件,同时将结果逐行输出到另一个带有排序数字的文件中。不过,我不太确定这样做会有多好。
你以前有过这样的尝试吗?或者你只是在寻找一种可能的方法?
发布于 2013-10-22 18:42:17
如果这就是您不需要PHP的全部(如果您手头有Linux maschine ):
sort -n file > file_sorted-asc
sort -nr file > file_sorted-desc编辑:好的,这是你的PHP解决方案(如果你手头有Linux maschine的话):
<?php
// Sort ascending
`sort -n file > file_sorted-asc`;
// Sort descending
`sort -nr file > file_sorted-desc`;
?>:)
https://stackoverflow.com/questions/19515439
复制相似问题