Я пытаюсь эффективно записать большой объем данных в файл (я относительно новичок в PHP) в устаревшей системе в файл, не убивая память. Он записывает только 50 клиентов за раз, но через некоторое время он значительно замедляется, поэтому я предполагаю, что он сохраняет весь файл в памяти. Есть идеи, как я могу просто добавить в файл и справиться с тем, что файл становится очень большим? Фрагмент кода ниже. Примечание: я застрял на PHP 5.3.
do{
//Tell the collection which page to load.
$collection->setCurPage($currentPage);
$collection->load();
$fp = fopen(Mage::getBaseDir('export') .'/customers.json', 'a');
foreach ($collection as $customer){
//write collection as json
fwrite($fp, "," . json_encode($customer->getData()));
$customerCount++;
}
fclose($fp);
$currentPage++;
//make the collection unload the data in memory so it will pick up the next page when load() is called.
$collection->clear();
echo memory_get_usage() . "\n";
echo "Finished page $currentPage of $pages \n";
} while ($currentPage <= $pages);
проверьте с помощью is_writable () права пользователя файла
спасибо @episch я могу написать без проблем .. проблема в размере памяти.
спасибо @smith Я расширил код. Память, используемая в цикле, очень мала, со временем она становится огромной, что говорит мне о том, что весь файл находится в памяти и расширяется.
Попробуйте закомментировать код файла, загрузка () сама по себе может быть тем, что пожирает память.
Спасибо @DaveS, это Magento, поэтому нам нужно загрузить коллекцию. Каждый раз это немного, и мы запускаем $ collection-> clear () дальше по коду. Я думаю, проблема в том, что когда я пишу в файл, он сохраняет весь файл в памяти.
Он этого не делает. Проблема находится где-то в коде, будь то ваш или Magento, а не в обработке файлов PHP.






$ fp был открыт в режиме добавления или? в этом вопросе много недостающего кода. добавление строк в цикле, как это, вероятно, не очень эффективно, но будет использовать меньше памяти, чем все сразу, так что это компромисс