【问题标题】:Handle Large File with PHP用 PHP 处理大文件
【发布时间】:2013-10-22 10:34:43
【问题描述】:

我有一个大小约为 10 GB 或更大的文件。该文件每行仅包含从 1 到 10 的数字,没有其他内容。现在的任务是从文件中读取数据[数字],然后按升序或降序对数字进行排序,并使用排序后的数字创建一个新文件。

谁能帮我解答一下?

【问题讨论】:

  • excel 文件? csv 文件?
  • 10GB 的原始文本文件?甚至操作系统也不愿意打开这些尺寸:|你有没有考虑过使用 PHP 来做类似的事情? PHP 不是为这样的事情设计的..

标签: php sorting large-files file-handling


【解决方案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+ 大小的文件将花费很长时间,但由于我没有看到任何限制关于您问题中的执行时间和性能,我认为没问题。

【讨论】:

    【解决方案2】:

    我之前也遇到过类似的问题。试图操作如此大的文件最终会消耗大量资源,并且无法应对。我最终得到的最简单的解决方案是尝试使用称为LOAD DATA INFILE的快速数据转储函数将其导入 MySQL 数据库@

    http://dev.mysql.com/doc/refman/5.1/en/load-data.html

    一旦进入,您应该能够操作数据。

    或者,您可以只逐行读取文件,同时将结果与排序后的数字逐行输出到另一个文件中。不过不太确定这会如何运作。

    你之前有没有尝试过,或者你只是在寻找一种可能的方法?

    【讨论】:

      【解决方案3】:

      如果你不需要 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`;
      
      ?>
      

      :)

      【讨论】:

      • sort 命令使用/tmp 目录来存储文件,因此/tmp 空间不足,排序将失败。您可以使用-T 开关指定要使用的任意临时目录。
      • 我想要一个使用 PHP 的解决方案。
      猜你喜欢
      • 2010-09-30
      • 2014-05-23
      • 1970-01-01
      • 2011-05-02
      • 1970-01-01
      • 1970-01-01
      • 2012-03-09
      相关资源
      最近更新 更多