У меня есть файл csv, в котором содержится 3,5 миллиона кодов.
Я должен отметить, что это только КАЖДОЙ будет один раз.Этот код должен занять более 3,5 миллионов строк, как я могу сделать его более эффективным?
CSV-выглядит
age9tlg,
rigfh34,
...
Вот мой код:
ini_set('max_execution_time', 600);
ini_set("memory_limit", "512M");
$file_handle = fopen("Weekly.csv", "r");
while (!feof($file_handle)) {
$line_of_text = fgetcsv($file_handle);
if (is_array($line_of_text))
foreach ($line_of_text as $col) {
if (!empty($col)) {
mysql_query("insert into `action_6_weekly` Values('$col', '')") or die(mysql_error());
}
} else {
if (!empty($line_of_text)) {
mysql_query("insert into `action_6_weekly` Values('$line_of_text', '')") or die(mysql_error());
}
}
}
fclose($file_handle);
этот код собирается умереть часть пути через меня? Будет ли моя память и максимальное время выполнения достаточно высокой?
NB: Этот код будет запущен на моем локальном хосте, а база данных находится на том же ПК, поэтому латентность не является проблемой.
Update:
вот другой возможной реализации. Это один делает это в объемных вставках 2000 записей
$file_handle = fopen("Weekly.csv", "r");
$i = 0;
$vals = array();
while (!feof($file_handle)) {
$line_of_text = fgetcsv($file_handle);
if (is_array($line_of_text))
foreach ($line_of_text as $col) {
if (!empty($col)) {
if ($i < 2000) {
$vals[] = "('$col', '')";
$i++;
} else {
$vals = implode(', ', $vals);
mysql_query("insert into `action_6_weekly` Values $vals") or die(mysql_error());
$vals = array();
$i = 0;
}
}
} else {
if (!empty($line_of_text)) {
if ($i < 2000) {
$vals[] = "('$line_of_text', '')";
$i++;
} else {
$vals = implode(', ', $vals);
mysql_query("insert into `action_6_weekly` Values $vals") or die(mysql_error());
$vals = array();
$i = 0;
}
}
}
}
fclose($file_handle);
, если я должен был использовать этот метод, что является самым высоким значением я мог установить его вставить сразу?
Update 2
так, ив нашел я могу использовать
LOAD DATA LOCAL INFILE 'C:\\xampp\\htdocs\\weekly.csv' INTO TABLE `action_6_weekly` FIELDS TERMINATED BY ';' ENCLOSED BY '"' ESCAPED BY '\\' LINES TERMINATED BY ','(`code`)
но вопрос в настоящее время является то, что я был неправ о формате CSV, это на самом деле 4-кодов, а затем разрыв строки, так fhroflg, qporlfg, vcalpfx, rplfigc,
vapworf, flofigx, apqoeei, clxosrc,
...
, поэтому мне нужно указать две ЛИНИИ, ОГРАНИЧЕННЫЕ
Этот вопрос был разветвлен до Here.
Update 3
Установка этого делать объемные вставки из 20k строк, используя
while (!feof($file_handle)) {
$val[] = fgetcsv($file_handle);
$i++;
if($i == 20000) {
//do insert
//set $i = 0;
//$val = array();
}
}
//do insert(for last few rows that dont reach 20k
, но он умирает в этот момент, потому что по какой-то причине $ Валу содержит 75K строк и идеи почему?
Обратите внимание, что приведенный выше код упрощен.
Должно быть очевидно, что крайне сложно вставить 3,5 миллиона записей в последовательности. SQL Server имеет специальную семантику массовой копии для больших объемных вставок; вы должны искать что-то подобное в MySQL. – mquander
вы можете запускать его по частям, таким как X количество записей каждые X минут, если вам не нужно запускать все это сразу. http://dev.mysql.com/doc/refman/5.0/en/mysqlimport.html – Prix
Итак, я пробовал делать объемную вставку на 200 тыс. строк, да интересная ошибка; Сервер MySQL ушел lol – Hailwood