2016-09-08 2 views
2

У меня проблема с утечкой памяти в этом коде. То, что я пытаюсь сделать, - временно загрузить довольно большой файл CSV (не менее 12 тыс. Записей) и проверить каждую запись для частичного дублирования других записей в файле CSV. Причина, почему я говорю «частичное дублирование», состоит в том, что в основном, если большинство записей совпадают (по меньшей мере 30 полей), это будет дубликат записи. Код, который я написал, теоретически должен работать так, как предполагалось, но, конечно, это довольно большой цикл и исчерпывает память. Это происходит в строке, содержащей «array_intersect».Проверка частичного дублирования в CSV в PHP

Это не для чего-то, за что мне платят, но это помогает нам облегчить жизнь на работе. Я сотрудник, занимающийся вводом данных, и сейчас мы должны смотреть на дубликаты записей вручную, что является asinine, поэтому я пытаюсь помочь, создав небольшую программу для этого.

Большое вам спасибо!

 if (isset($_POST["submit"])) { 
      if (isset($_FILES["sheetupload"])) { 
       $fh = fopen(basename($_FILES["sheetupload"]["name"]), "r+"); 
       $lines = array(); 
       $records = array(); 
       $counter = 0; 

       while(($row = fgetcsv($fh, 8192)) !== FALSE) { 
        $lines[] = $row; 
       } 

       foreach ($lines as $line) { 
        if(!in_array($line, $records)){ 
         if (count($records) > 0) { 
          //check array against records for dupes 
          foreach ($records as $record) { 
           if (count(array_intersect($line, $record)) > 30) { 
            $dupes[] = $line; 
            $counter++; 
           } 
           else { 
            $records[] = $line; 
           } 
          } 
         } 
         else { 
          $records[] = $line; 
         } 
        } 
        else { 
         $counter++; 
        } 
       } 


       if ($counter < 1) { 
        echo $counter." duplicate records found. New file not created."; 
       } 
       else { 
        echo $counter." duplicate records found. New file created as NEWSHEET.csv."; 
        $fp = fopen('NEWSHEET.csv', 'w'); 
        foreach ($records as $line) { 
         fputcsv($fp, $line); 
        } 
       } 
      } 
     } 
+0

Так что скрипт делает запустить из памяти, да? –

+0

, если вы его не убьете, следующая вещь, вероятно, приведет к ограничению времени выполнения – RiggsFolly

+0

Какое фактическое сообщение об ошибке вы получаете? – RiggsFolly

ответ

0

Пару возможностей, предполагая, что сценарий достигает предела памяти или времени ожидания. Если вы можете получить доступ к файлу php.ini, попробуйте увеличить memory_limit и max_execution_time.

Если вы не можете получить доступ к настройкам сервера, попробуйте добавить их к верхней части вашего скрипта:

ini_set('memory_limit','256M'); // change this number as necessary 
set_time_limit(0); // so script does not time out 

Если изменение этих параметров в сценарии не представляется возможным, вы можете попробовать использовать незаданы() в несколько мест, чтобы освободить память:

// after the first while loop 
unset($fh, $row); 

и

//at end of each foreach loop 
unset($line); 
+0

Я попытался использовать memory_limit и set_time_limit в дополнение к отключению переменных уже безрезультатно. Однако, спасибо! –

+0

OK .. может быть, вы можете разделить csv на более мелкие куски, а затем объединить куски в конце скрипта. Также попробуйте PHPExcel ---> https://github.com/PHPOffice. Они используют кеширование ячеек для проблем, связанных с памятью. –

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