Intereting Posts
Установка PHP tmp dir – загрузка PHP не работает Как использовать sync () с дополнительными полями поворота алгоритм для преобразования md5 (или, может быть, другой метод хэширования?) в целое число, где можно установить возможные результирующие целые диапазоны (например: 1-10000)? создать таблицу в pdf с данными об обертке, используя fpdf в php Как создать новую пустую Eloquent Collection в Laravel 4 PHP 5.3.10 и ошибка синтаксиса PHP 5.5.3 неожиданно "[' imagettftext не может открыть файл шрифта Как я могу гарантировать, что все ключевые имена в PHP, сгенерированном JSON, являются строками? включил php-файл, чтобы узнать его имя? Как заставить Composer загрузить локальный пакет? Zend framework $ db-> результат обновления Установить сеанс var с помощью ajax Функция Javascript всегда не запускается после .load Использование & amp; в URL-адресах ошибка $ _GET Ошибка при отправке электронной почты с помощью phpmailer – Ошибка при передаче SMTP-сообщений: данные не принимаются

Чтение и анализ содержимого очень большого файла

Я пытаюсь проанализировать файл с разделителями табуляции размером ~ 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 вы также можете установить позицию позже ….