Я пытаюсь проанализировать файл с разделителями табуляции размером ~ 1 ГБ.
Где я запускаю скрипт, я получаю:
Fatal error: Allowed memory size of 1895825408 bytes exhausted (tried to allocate 1029206974 bytes) ...
Мой сценарий на данный момент справедлив:
$file = file_get_contents('allCountries.txt') ; $file = str_replace(array("\r\n", "\t"), array("[NEW*LINE]", "[tAbul*Ator]"), $file) ;
Я установил ограничение памяти в php.ini равным -1, которое затем дает мне:
Fatal error: Out of memory (allocated 1029963776) (tried to allocate 1029206974 bytes)
В любом случае, чтобы частично открыть файл, а затем перейти к следующей части, чтобы уменьшить количество памяти за один раз?
Да, вы можете прочитать это по строкам:
$handle = @fopen("/tmp/inputfile.txt", "r"); if ($handle) { while (($buffer = fgets($handle, 4096)) !== false) { echo $buffer; } fclose($handle); }
Вы должны использовать блоки для чтения файла. Проверьте ответ на этот вопрос. https://stackoverflow.com/a/6564818/1572528
Вы также можете попробовать использовать это для менее крупных файлов.
ini_set('memory_limit', '32M'); //max size 32m
Вы уверены, что это неудачно, а не тайм-аут вашего скрипта? По умолчанию обычно около 30 секунд или около того, и если ваш файл занимает больше времени, чем для чтения, это может привести к его отключению.
Еще одна вещь, которую следует учитывать, может быть ограничением памяти на вашем скрипте – чтение файла в массив может обойти это, поэтому проверьте свой журнал ошибок на наличие предупреждений о памяти.
Если ни одна из вышеперечисленных проблем не является вашей проблемой, вы можете изучить использование fgets
для чтения файла в строке за строкой, обрабатывая по мере поступления.
$handle = fopen("/tmp/uploadfile.txt", "r") or die("Couldn't get handle"); if ($handle) { while (!feof($handle)) { $buffer = fgets($handle, 4096); // Process buffer here.. } fclose($handle); }
редактировать
PHP, похоже, не вызывает ошибку, он просто возвращает false.
$rawfile
ли путь к $rawfile
относительно того, где работает скрипт? Возможно, попробуйте установить абсолютный путь здесь для имени файла.
Да, используйте fopen и fread / fgets для этого:
http://www.php.net/manual/en/function.fread.php
string fread ( resource $handle , int $length )
Задайте $ length для того, сколько файлов вы хотите прочитать. $ Handle сохраняет позицию для новых чтений, а с помощью fseek вы также можете установить позицию позже ….