打开并阅读2GB csv

tag*_*tag 1 php csv

我在打开和阅读2gb csv文件的内容时遇到了问题.每次我运行脚本都会耗尽服务器内存(10GB VPS云服务器)然后被杀死.我已经制作了一个测试脚本,并想知道是否有人可以看看并确认我没有做任何愚蠢的事情(php明智),这将导致看起来和非常大量的内存使用量.我已经和我的托管公司谈过,但他们似乎认为这是一个代码问题.所以只是想知道是否有人可以查看这个并确认代码中没有任何内容会导致此类问题.

此外,如果你处理2GB的csvs,你之前是否有类似的东西?

谢谢

蒂姆

<?php

ini_set("memory_limit", "10240M");

$start = time();
echo date("Y-m-d H:i:s", $start)."\n";

$file = 'myfile.csv';

$lines = $keys = array();
$line_count = 0;
$csv = fopen($file, "r");

if(!empty($csv))
{
    echo "file open \n";

    while(($csv_line = fgetcsv($csv, null, ',', '"')) !== false)
    {
        if($line_count==0) {
            foreach($csv_line as $item) {
                $keys[] = preg_replace("/[^a-zA-Z0-9]/", "", $item);    
            }
        } else {
            $array = array();
            for ($i = 0; $i <count($csv_line); $i++) {
                $array[$keys[$i]] =  $csv_line[$i]; 
            }
            $lines[] = (object) $array;

            //print_r($array);
            //echo "<br/><br/>";
        }
        $line_count++;
    }

    if ($line_count == 0) {
        echo "invalid csv or wrong delimiter / enclosure ".$file;
    }

} else {
    echo "cannot open ".$file;
}
fclose ($csv);

echo $line_count . " rows \n";

$end = time();
echo date("Y-m-d H:i:s", $end)."\n";

$time = number_format((($end - $start)/60), 2);

echo $time."\n";

echo "peak memory usages ".memory_get_peak_usage(true)."\n";
Run Code Online (Sandbox Code Playgroud)

You*_*nse 5

它实际上不是一个"开放"问题,而是处理问题

我相信你不需要像现在这样将所有已解析的行保留在内存中.

为什么不把解析后的行放在它所属的任何地方 - 数据库或其他文件或其他什么?

它会使您的代码一次只保留在内存中.