PHP « Импорт CSV большого размера

Здравствуйте! Подскажите, как рациональней импортировать таблицу csv в базу данных. Импортировать придется еженедельно. В настоящее время она состоит из более чем 3млн строк и весит порядка 200 Мб.
Производить импорт целиком или разбивать ее на множество файлов?
P.S. в php.ini значения memory_limit = 128M и memory_limit = 256M.

1 ответов


собственно считать все строки через fgetcsv в цикле


$fp=fopen('file.csv','r');
while(false!=($row=fgetcsv($fp))){
   //do something...
}
 
ограничение только по времени может возникнуть

Читаем про команду MySql LOAD DATA INFILE и не изобретаем велосипед.
http://phpclub.ru/mysql/doc/load-data.html


Есть другой вариант. Импортировать по частям. В идеале можно импортировать какое то определённое количество строк или записей в зависимости от структуры файла, при завершении обработки скрипт вернёт место в файле с которого необходимо начать. А если сделать такую процедуру через обычный ajax с получением и отсылкой места на котором скрипт закончил обработку строки, то можно поставить на импорт и пойти курить.


if( isset( $_GET['setimport'] ) ){
 
  $file_name = ''; // абсолютный путь до файла
 
  if( !empty( $_GET['setimport'] ) ){
    $line = intval( $_GET['setimport'] );
  }
  else{
    $line = 0;
  }
 
  import_big_file( $line, $file_name );
}
     
//Построчное считываение файла
function import_big_file( $im = 0, $file_name ){
 
  $count_line = 0; //количество записей
 
  if ( ( $handle_f = fopen( $file_name, "r" ) ) !== FALSE ){
   
    fseek( $handle_f, $im );
   
    while ( !feof( $handle_f ) ){
     
      $line = fgets( $handle_f, 4096 );
     
      //обрабатываем строку
      echo $line;
     
      //считаем количество строк
      if( $count_line >=300 ){
          echo "<div><a href='?setimport=" . ftell($handle_f) . "'>Продолжить импорт с " . ftell($handle_f) . "</a>";
          break 1;
      }
    }
    fclose( $handle_f );
  }
  else{
    echo "Не получилось открыть файл";
  }
}
 

таким способом импортировал с внесением или обновлением записей в базе в зависимости от параметров в строке файлы размером от 300 метров.