Чтение больших данных из файла csv в php

Я читаю csv и проверяю с помощью mysql, что записи присутствуют в моей таблице или нет в php.

csv имеет около 25000 записей, и когда я запускаю свой код, он отображает ошибку «Service Unavailable» после 2 м 10 с (onload: 2 м 10 с)

здесь я добавил код

// for set memory limit & execution time ini_set('memory_limit', '512M'); ini_set('max_execution_time', '180'); //function to read csv file function readCSV($csvFile) { $file_handle = fopen($csvFile, 'r'); while (!feof($file_handle) ) { set_time_limit(60); // you can enable this if you have lot of data $line_of_text[] = fgetcsv($file_handle, 1024); } fclose($file_handle); return $line_of_text; } // Set path to CSV file $csvFile = 'my_records.csv'; $csv = readCSV($csvFile); for($i=1;$i<count($csv);$i++) { $user_email= $csv[$i][1]; $qry = "SELECT u.user_id, u.user_email_id FROM tbl_user as u WHERE u.user_email_id = '".$user_email."'"; $result = @mysql_query($qry) or die("Couldn't execute query:".mysql_error().''.mysql_errno()); $rec = @mysql_fetch_row($result); if($rec) { echo "Record exist"; } else { echo "Record not exist"; } } 

Примечание. Я просто хочу перечислять записи, которые не существуют в моей таблице.

Пожалуйста, предложите мне решение по этому вопросу …

Solutions Collecting From Web of "Чтение больших данных из файла csv в php"

Отличный способ обработки больших файлов находится по адресу: https://stackoverflow.com/a/5249971/797620

Этот метод используется на http://www.cuddlycactus.com/knownpasswords/ для поиска более 170 миллионов паролей всего за несколько миллисекунд.

Обычно ошибка « Service Unavailable » возникает при возникновении 500 ошибок. Я думаю, что это происходит из-за недостаточного времени выполнения. Проверьте свою консоль журнала / браузера, возможно, вы можете увидеть 500 ошибок.

Прежде всего, Keep set_time_limit (60) из цикла.

Сделайте некоторые изменения, например,

  1. Примените INDEX к столбцу user_email_id, чтобы быстрее получить строки с помощью выбранного запроса.
  2. Не эхо-сообщение. Не оставляйте выходной буфер.

А также

Я сделал такой подход, используя программу с открытым исходным кодом. Вы можете получить его здесь http://sourceforge.net/projects/phpexcelreader/

Попробуй это.

После многого, наконец, я нашел хорошее решение, может быть, это и помогает другим. Когда я попробовал файл csv 2,367KB, содержащий 18226 строк, наименьшее время, затраченное различными скриптами php, было (1) из документации phget.net fgetcsv именем CsvImporter и (2) file_get_contents => PHP. Неустранимая ошибка:

(1) взял 0.92574405670166 (2) взял 0.12543702125549 (строка) и 0.52903485298157 (разделен на массив) Примечание: этот расчет не включает добавление в mysql.

Лучшее решение, которое я нашел, использует 3.0644409656525 включая добавление в базу данных и некоторую условную проверку. Обработка 8-мегабайтного файла заняла 11 секунд. Решение:

 $csvInfo = analyse_file($file, 5); $lineSeperator = $csvInfo['line_ending']['value']; $fieldSeperator = $csvInfo['delimiter']['value']; $columns = getColumns($file); echo '<br>========Details========<br>'; echo 'Line Sep: \t '.$lineSeperator; echo '<br>Field Sep:\t '.$fieldSeperator; echo '<br>Columns: ';print_r($columns); echo '<br>========Details========<br>'; $ext = pathinfo($file, PATHINFO_EXTENSION); $table = str_replace(' ', '_', basename($file, "." . $ext)); $rslt = table_insert($table, $columns); if($rslt){ $query = "LOAD DATA LOCAL INFILE '".$file."' INTO TABLE $table FIELDS TERMINATED BY '$fieldSeperator' "; var_dump(addToDb($query, false)); } function addToDb($query, $getRec = true){ //echo '<br>Query : '.$query; $con = @mysql_connect('localhost', 'root', ''); @mysql_select_db('rtest', $con); $result = mysql_query($query, $con); if($result){ if($getRec){ $data = array(); while ($row = mysql_fetch_assoc($result)) { $data[] = $row; } return $data; }else return true; }else{ var_dump(mysql_error()); return false; } } function table_insert($table_name, $table_columns) { $queryString = "CREATE TABLE " . $table_name . " ("; $columns = ''; $values = ''; foreach ($table_columns as $column) { $values .= (strtolower(str_replace(' ', '_', $column))) . " VARCHAR(2048), "; } $values = substr($values, 0, strlen($values) - 2); $queryString .= $values . ") "; //// echo $queryString; return addToDb($queryString, false); } function getColumns($file){ $cols = array(); if (($handle = fopen($file, 'r')) !== FALSE) { while (($row = fgetcsv($handle)) !== FALSE) { $cols = $row; if(count($cols)>0){ break; } } return $cols; }else return false; } function analyse_file($file, $capture_limit_in_kb = 10) { // capture starting memory usage $output['peak_mem']['start'] = memory_get_peak_usage(true); // log the limit how much of the file was sampled (in Kb) $output['read_kb'] = $capture_limit_in_kb; // read in file $fh = fopen($file, 'r'); $contents = fread($fh, ($capture_limit_in_kb * 1024)); // in KB fclose($fh); // specify allowed field delimiters $delimiters = array( 'comma' => ',', 'semicolon' => ';', 'tab' => "\t", 'pipe' => '|', 'colon' => ':' ); // specify allowed line endings $line_endings = array( 'rn' => "\r\n", 'n' => "\n", 'r' => "\r", 'nr' => "\n\r" ); // loop and count each line ending instance foreach ($line_endings as $key => $value) { $line_result[$key] = substr_count($contents, $value); } // sort by largest array value asort($line_result); // log to output array $output['line_ending']['results'] = $line_result; $output['line_ending']['count'] = end($line_result); $output['line_ending']['key'] = key($line_result); $output['line_ending']['value'] = $line_endings[$output['line_ending']['key']]; $lines = explode($output['line_ending']['value'], $contents); // remove last line of array, as this maybe incomplete? array_pop($lines); // create a string from the legal lines $complete_lines = implode(' ', $lines); // log statistics to output array $output['lines']['count'] = count($lines); $output['lines']['length'] = strlen($complete_lines); // loop and count each delimiter instance foreach ($delimiters as $delimiter_key => $delimiter) { $delimiter_result[$delimiter_key] = substr_count($complete_lines, $delimiter); } // sort by largest array value asort($delimiter_result); // log statistics to output array with largest counts as the value $output['delimiter']['results'] = $delimiter_result; $output['delimiter']['count'] = end($delimiter_result); $output['delimiter']['key'] = key($delimiter_result); $output['delimiter']['value'] = $delimiters[$output['delimiter']['key']]; // capture ending memory usage $output['peak_mem']['end'] = memory_get_peak_usage(true); return $output; 

}