我有一个脚本,可以解析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 = [];
}
迭代大数据并将其推入数组将增加内存使用量。因此,在这种情况下,文件越大,内存使用越大。如果需要在处理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);
}