Прочитайте огромные текстовые файлы и сохраните каждую строку в базе данных

Я написал PHP-скрипт, который проходит через текстовый файл (фактически это файл «list» из imdb) и сохраняет его в моей локальной базе данных MySQL.

public static function updateMovies( $list ) { $offset = 15; // movies.list start with movie names at line 16 $handle = fopen($list, "r") or die("Couldn't get handle"); if ($handle) { while (!feof($handle)) { $buffer = fgets($handle); if($offset!=0) $offset--; else if($buffer[0] != '"'){ $title = trim( substr( $buffer, 0, strpos( $buffer, '(' ) ) ); $year = intval(trim( substr( $buffer, strpos( $buffer,'(' )+1, 4 ) )); Movie::create( $title, $year ); } } fclose($handle); } } 

Поскольку эти списки-файлы имеют размер до 200 МБ, это занимает много времени. По умолчанию PHP MAX_EXECUTION_TIME установлен на 30 секунд.

Я установил это значение в 300, чтобы попробовать, если он будет работать. Например, мой файл «movies.list» составляет около 80 МБ и с использованием этого скрипта в течение 300 секунд создается около 25000 строк в моей базе данных. Это не работает, потому что я даже не дошел до фильмов, начиная с «B».

Я знаю, что могу установить MAX_EXECUTION_TIME 0 (неограниченно), но в будущем я не хочу, чтобы эта база данных находилась на моем локальном хосте. Насколько я знаю, на моем веб-сервере и на моих веб-серверах MAX_EXECUTION_TIME установлено значение 90.

Любые идеи, как бы вы справились с этим?

Related of "Прочитайте огромные текстовые файлы и сохраните каждую строку в базе данных"

Вы можете: Использовать set_time_limit (sec) или (лучше) запустить сценарий из командной строки через запись cron. Таким образом, вы избежите многих других проблем с тайм-аутом, не относящихся к php.

Я не думаю, что это идея для вас, чтобы вы загрузили такой большой файл непосредственно в вашу базу данных … особенно когда требуется так много времени для завершения

Мой совет

Разбивайте файлы на мелкие куски локально .. затем на удаленном сервере загрузите его в свою базу данных

Пример (Документация: http://en.wikipedia.org/wiki/Split_%28Unix%29 )

  exec('split -d -b 2048m ' . $list . ' chunks'); 

Для чистой реализации PHP см.

http://www.php.happycodings.com/File_Manipulation/code50.html

Или

 define('CHUNK_SIZE', 1024*1024); function readfile_chunked($filename, $retbytes = TRUE) {  $buffer = '';  $cnt =0;  // $handle = fopen($filename, 'rb');  $handle = fopen($filename, 'rb');  if ($handle === false) {   return false;  }  while (!feof($handle)) {   $buffer = fread($handle, CHUNK_SIZE);   echo $buffer;   ob_flush();   flush();   if ($retbytes) {    $cnt += strlen($buffer);   }  }  $status = fclose($handle);  if ($retbytes && $status) {   return $cnt; // return num. bytes delivered like readfile() does.  }  return $status; }