2013-07-03 2 views
0

Я хочу загрузить файл csv в базу данных, поэтому я использую плагин word-press для этого. У меня размер файла 350 МБ. Хотя я скопировал некоторые данные и сохранил их в новом файле, и теперь он имеет размер файла 14 МБ, а общее количество строк - 66872.Проблема с ограничением массива

Когда я пытаюсь загрузить этот файл, сценарий не работает после загрузки 63296 строк данных в массиве. Я проверяю форум и в основном говорю о его проблеме memory_limit. Я даже изменяю memory_limit = 2000M, но это не помогло.

Вот код из плагина

function csv_file_data($file, $delim) { 
      $this->checkUploadDirPermission(); 
      ini_set ("auto_detect_line_endings", true); 

      $data_rows = array(); 
      $resource = fopen ($file, 'r'); 
      //print $file; 
      $init = 0; 
      while ($keys = fgetcsv ($resource, '', $this->delim, '"')) { 
        print $keys; 
        print $init; 
        if ($init == 0) { 
          $this->headers = $keys; 
        } else { 
          array_push ($data_rows, $keys); 
        } 

        $init ++; 
      } 
      //print_r($data_rows); 
      print $init; 
      fclose ($resource); 
      ini_set ("auto_detect_line_endings", false); 
      return $data_rows; 
    } 
+0

Если это происходит во время загрузки я думаю, что проблема с [загрузки файлов] (http://php.net/upload). –

+1

Вы пытаетесь прочитать полный файл в массиве? это плохая идея для больших файлов, очевидно, это должно выполняться по строкам. Это также может быть до max_execution_time, если скрипт работает слишком долго, попробуйте его повысить. – Andrew

+0

@Andrew да, что он делает так, я увеличиваю max_execution_time, но он не работал – Uahmed

ответ

2

Вы не должны загрузить весь файл в память.

Вот правильный пример:

if (($handle = fopen("test.csv", "r")) !== FALSE) { 
    while (($data = fgetcsv($handle, 2000, ",")) !== FALSE) { 
    // Do your staff with $data array 
    } 
    fclose($handle); 
} 
+0

Спасибо за ответ, так что он будет загружать 2000 строк до конца файла? пожалуйста, исправьте меня, если я ошибаюсь – Uahmed

+0

Вы ошибаетесь. Этот код будет читать весь файл. 2000 - максимальная длина строки, в php5 вы можете просто использовать fgetcsv ($ handle) для чтения строки без ограничения длины строки. –

+0

Что делать, если длина строки превышает 2000? – Uahmed

Смежные вопросы