Каков наилучший способ прочитать файл в php относительно небольшими фрагментами данных?
Например, прочитайте 5 МБ, а затем освободите эту память и прочитайте еще 5 МБ
Я пишу инструмент разбора в php, который должен прочитать HUGE-файл и преобразовать его в CSV.
Моя проблема заключается в том, что я постоянно превысил допустимый предел памяти, а повышение в моей среде не является вариантом.
Это часть кода, который выполняет свою работу:
$i = 0; $fileName = "test.txt"; $file = fopen($fileName,'r'); while($i <= 2000) { $line = fgets($file); $streetsheet[$i] = preg_split('@\ @',$line,NULL, PREG_SPLIT_NO_EMPTY); ++$i; } fclose($file); $fp = fopen('result.csv','w'); foreach($streetsheet as $key=>$value) { fputcsv($fp, $value); }
Например, в отломе, показанном выше, я читаю первые 2000 строк файла, и он работает отлично.
Проблема возникает, когда я меняю условие на
while(!feof($file)){\*....*\}
Он сразу сообщает мне, что я превысил допустимый предел памяти, а затем он сообщает мне, что строка, вызывающая проблему, является той, где я использую preg_split.
Так что мне интересно, что лучший способ прочитать файл сказать … 1000 строк за раз?
Благодаря!
Если вы собираетесь с понижением, по крайней мере, иметь общую любезность, чтобы объяснить, почему
Вы уже читаете его в «частях»: вы читаете его по очереди. Проблема в том, что вы вставляете все строки в массив и затем сбрасываете массив.
Вместо этого прочитайте строку и выведите строку и полностью пропустите массив:
$fileName = "test.txt"; $file = fopen($fileName,'r'); $fp = fopen('result.csv','w'); while(!feof($file)) { $line = fgets($file); $value = preg_split('@\ @',$line,NULL, PREG_SPLIT_NO_EMPTY); fputcsv($fp, $value); } fclose($file); fclose($fp);