【问题标题】:PHP - parse large CSV into array of arrays - memory size exhaustedPHP - 将大型 CSV 解析为数组数组 - 内存大小耗尽
【发布时间】:2016-03-08 18:52:21
【问题描述】:

我想就这项任务寻求帮助: 我有大 CSV:680 列 x 1300 行,我需要按列解析它(我需要有列值数组的数组)。

我为此使用此代码:

$input = "data/input.csv";

    if (($handle = fopen($input, "r")) !== false) {
        $filesize = filesize($input);
        while (($data = fgetcsv($handle, $filesize, "$")) !== false) {
            for ($i = 0; $i < count($data); $i++) {
                $this->columns[$i][] = $data[$i];
            }
        }
        fclose($handle);

问题是,我得到了这个错误

致命错误:/www/classes/Analyser.php 第 72 行中允许的内存大小为 134217728 字节已用尽(尝试分配 16384 字节)

第 72 行是 $this->columns[$i][] = $data[$i];

我的主机不允许我增加内存限制。有没有办法高效地编写代码,所以不需要那么多内存,还是只是这么大的CSV的问题?

谢谢大家。

【问题讨论】:

  • 您的问题是试图将一个大的 csv 文件读入内存。如果您想逐列而不是逐行解析它,那么您可能需要多次读取 csv,每列一次,构建仅包含该列的数组,处理它,然后倒带并重复下一列
  • 是的,我明白了。请问您可以编辑我的代码以读取每列的csv一次,处理它并再次读取吗?我正在尝试,但它不起作用。非常感谢

标签: php parsing csv memory-leaks


【解决方案1】:

看看PHP Generators。它们旨在解决这个问题。

【讨论】:

    【解决方案2】:
    function analyze_column($column) {
        // do your work here
        return $the_results;
    }
    
    $a = 0;
    $results = array();
    
    while ($a < COUNT_OF_COLUMNS) {
        $column = Array();
        while (($data = fgetcsv($handle, $filesize, "$")) !== false) {
            array_push($column,$data[$a]);
        }
    
        $results[] = analyze_column($column);
    
        $a++;
    }
    

    【讨论】:

    • 还是一样,一旦$列被清空,我就可以推到它了。
    • 有错误吗?您可能需要提供其余代码才能获得答案。
    猜你喜欢
    • 2018-02-20
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2015-05-21
    • 1970-01-01
    相关资源
    最近更新 更多