如何解析包含php中1500万行数据的csv文件

问题描述 投票:0回答:1

我有一个脚本,可以解析CSV文件并开始验证电子邮件。这适用于1000行。但在1500万行上却显示内存耗尽错误。文件大小为400MB。有什么建议么?如何解析和验证它们?

服务器规格:具有32GB Ram的Core i7

function parse_csv($file_name, $delimeter=',') {
  $header = false;
  $row_count = 0;
  $data = [];

  //  clear any previous results
  reset_parse_csv();

  // parse
  $file = fopen($file_name, 'r');
  while (!feof($file)) {
    $row = fgetcsv($file, 0, $delimeter);
    if ($row == [NULL] || $row === FALSE) { continue; }
    if (!$header) {
      $header = $row;
    } else {
      $data[] = array_combine($header, $row);
      $row_count++;
    }
  }
  fclose($file);

  return ['data' => $data, 'row_count' => $row_count];

}

function reset_parse_csv() {
  $header = false;
  $row_count = 0;
  $data = [];    
}
php csv fgetcsv
1个回答
0
投票

迭代大数据并将其推入数组将增加内存使用量。因此,在这种情况下,文件越大,内存使用越大。如果需要在处理CSV数据之前对其进行格式化的功能,则至少应使用generators。像这样的东西:



function csv_read($filename, $delimeter=',')
{
    $header = [];
    $row = 0;
    $handle = fopen($filename, "r");

    if ($handle == false) {
        return false;
    }

    while (($data = fgetcsv($handle, 0, $delimeter)) !== false) {

        if (0 == $row) {
            $header = $data;
        } else {
            # on demand usage
            yield array_combine($header, $data);
        }

        $row++;
    }
    fclose($handle);
}

然后:

$generator = csv_read('rdu-weather-history.csv', ';');

foreach ($generator as $item) {
   do_something($item);
}
© www.soinside.com 2019 - 2024. All rights reserved.