Я пытаюсь прочитать 738627 записей из плоского файла в MySQl. Кажется, что скрипт работает нормально, но дает мне вышеупомянутые ошибки памяти.
Образец файла:
#export_dategenre_idapplication_idis_primary #primaryKey:genre_idapplication_id #dbTypes:BIGINTINTEGERINTEGERBOOLEAN #exportMode:FULL 127667880285760002817317350 127667880285760002818261461 127667880285760002825372301 127667880285760002827785570 127667880285760002827930241 127667880285760002827987861 127667880285760002828089791 127667880285760002828168361 127667880285760002828192041 127667880285760002829144541 127667880285760002829351511
Я попытался увеличить разрешенную память, используя
ini_set("memory_limit","80M");
и он все еще терпит неудачу. Продолжаю ли я продолжать эту работу до тех пор, пока она не закончится?
Полный код
<?php ini_set("memory_limit","80M"); $db = mysql_connect("localhost", "uname", "pword"); // test connection if (!$db) { echo "Couldn't make a connection!"; exit; } // select database if (!mysql_select_db("dbname",$db)) { echo "Couldn't select database!"; exit; } mysql_set_charset('utf8',$db); $delimiter = chr(1); $eoldelimiter = chr(2) . "\n"; $fp = fopen('genre_application','r'); if (!$fp) {echo 'ERROR: Unable to open file.</table></body></html>'; exit;} $loop = 0; while (!feof($fp)) { $loop++; $line = stream_get_line($fp,128,$eoldelimiter); //use 2048 if very long lines if ($line[0] === '#') continue; //Skip lines that start with # $field[$loop] = explode ($delimiter, $line); $fp++; $export_date = $field[$loop][0]; $genre_id = $field[$loop][1]; $application_id = $field[$loop][2]; $query = "REPLACE into genre_apps (export_date, genre_id, application_id) VALUES ('$export_date','$genre_id','$application_id')"; print "SQL-Query: ".$query."<br>"; if(mysql_query($query,$db)) { echo " OK !\n"; } else { echo "Error<br><br>"; echo mysql_errno() . ":" . mysql_error() . "</font></center><br>\n"; } } fclose($fp); ?>
Ваш цикл заполняет поле переменной $field
без причины (он записывает в другую ячейку на каждой итерации цикла), тем самым увеличивая количество памяти в каждой строке.
Вы можете заменить:
$field[$loop] = explode ($delimiter, $line); $export_date = $field[$loop][0]; $genre_id = $field[$loop][1]; $application_id = $field[$loop][2];
С:
list($export_date, $genre_id, $application_id) = explode($delimiter, $line);
Для повышения производительности вы можете воспользоваться возможностью вставлять несколько строк, используя REPLACE INTO
, группируя N строк в один запрос.