Итерации по большому набору данных (строки файла и т. Д. c.) И помещение его в массив увеличивает использование памяти, и это прямо пропорционально количеству обрабатываемых элементов. Таким образом, чем больше файл, тем больше использование памяти - в данном случае. Если вам нужна функция форматирования данных CSV перед их обработкой, резервное копирование на генераторах звучит как отличная идея.
Чтение PHP do c подходит очень хорошо для вашего случая (выделение мое):
Генератор позволяет вам писать код, который использует foreach для перебора набора данных без необходимости создания массива в памяти , что может привести к превышению лимита памяти или значительному времени обработки для генерации.
Примерно так:
function csv_read($filename, $delimeter=',')
{
$header = [];
$row = 0;
# tip: dont do that every time calling csv_read(), pass handle as param instead ;)
$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);
}
Основное отличие здесь заключается в следующем: вы не получаете (из памяти) и не используете все данные за один раз . Вы получаете элементы по требованию (как поток) и обрабатываете их вместо один элемент за раз . Это имеет огромное влияние на использование памяти.
PS: CSV-файл выше взят из: https://data.townofcary.org/api/v2/catalog/datasets/rdu-weather-history/exports/csv