Selamat pagi, Saya sebenarnya sedang menjalani beberapa pelajaran sulit saat mencoba menangani file csv berukuran besar hingga 4 GB.
Tujuannya adalah untuk mencari beberapa item dalam file csv (datafeed Amazon) dengan node browser tertentu dan juga dengan beberapa id item tertentu (ASIN). Untuk mendapatkan campuran item yang ada (di database saya) ditambah beberapa item baru tambahan karena dari waktu ke waktu item menghilang di pasar. Saya juga memfilter judul item karena banyak item yang menggunakan judul yang sama.
Saya telah membaca banyak tips di sini dan akhirnya memutuskan untuk menggunakan fgetcsv() php dan berpikir fungsi ini tidak akan menghabiskan memori, karena membaca file baris demi baris. Tapi apa pun yang saya coba, saya selalu kehabisan memori. Saya tidak mengerti mengapa kode saya menggunakan begitu banyak memori.
Saya menetapkan batas memori ke 4096MB, batas waktu adalah 0. Server memiliki Ram 64 GB dan dua harddisk SSD.
Bolehkah seseorang memeriksa potongan kode saya dan menjelaskan bagaimana mungkin saya kehabisan memori dan yang lebih penting bagaimana memori digunakan?
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);
}
}