Доброе утро, я на самом деле прохожу несколько тяжелых уроков, пытаясь обрабатывать огромные CSV-файлы размером до 4 ГБ.
Цель состоит в том, чтобы искать некоторые элементы в CSV-файле (канал данных Amazon) по заданному узлу просмотра, а также по некоторым заданным идентификаторам элементов (ASIN). Чтобы получить смесь существующих предметов (в моей базе данных) плюс несколько дополнительных новых предметов, так как время от времени предметы исчезают на рынке. Я также фильтрую названия элементов, потому что многие элементы используют одно и то же.
Я читал здесь много советов и, наконец, решил использовать php fgetcsv() и подумал, что эта функция не будет исчерпывать память, так как она читает файл построчно. Но что бы я ни пытался, мне всегда не хватает памяти. Я не могу понять, почему мой код использует так много памяти.
Я установил ограничение памяти на 4096 МБ, ограничение по времени равно 0. Сервер имеет 64 ГБ оперативной памяти и два жестких диска SSD.
Может кто-нибудь проверить мой фрагмент кода и объяснить, как это возможно, что у меня заканчивается память и, что более важно, как используется память?
private function performSearchByASINs()
{
$found = 0;
$needed = 0;
$minimum = 84;
if(is_array($this->searchASINs) && !empty($this->searchASINs))
{
$needed = count($this->searchASINs);
}
if($this->searchFeed == NULL || $this->searchFeed == '')
{
return false;
}
$csv = fopen($this->searchFeed, 'r');
if($csv)
{
$l = 0;
$title_array = array();
while(($line = fgetcsv($csv, 0, ',', '"')) !== false)
{
$header = array();
if(trim($line[6]) != '')
{
if($l == 0)
{
$header = $line;
}
else
{
$asin = $line[0];
$title = $this->prepTitleDesc($line[6]);
if(is_array($this->searchASINs)
&& !empty($this->searchASINs)
&& in_array($asin, $this->searchASINs)) //search for existing items to get them updated
{
$add = true;
if(in_array($title, $title_array))
{
$add = false;
}
if($add === true)
{
$this->itemsByASIN[$asin] = new stdClass();
foreach($header as $k => $key)
{
if(isset($line[$k]))
{
$this->itemsByASIN[$asin]->$key = trim(strip_tags($line[$k], '<br><br/><ul><li>'));
}
}
$title_array[] = $title;
$found++;
}
}
if(($line[20] == $this->bnid || $line[21] == $this->bnid)
&& count($this->itemsByKey) < $minimum
&& !isset($this->itemsByASIN[$asin])) // searching for new items
{
$add = true;
if(in_array($title, $title_array))
{
$add = false;
}
if($add === true)
{
$this->itemsByKey[$asin] = new stdClass();
foreach($header as $k => $key)
{
if(isset($line[$k]))
{
$this->itemsByKey[$asin]->$key = trim(strip_tags($line[$k], '<br><br/><ul><li>'));
}
}
$title_array[] = $title;
$found++;
}
}
}
$l++;
if($l > 200000 || $found == $minimum)
{
break;
}
}
}
fclose($csv);
}
}