Ich habe eine CSV-Datei, die 3,5 Millionen Codes enthält.
Ich sollte darauf hinweisen, dass dies nur einmal dieses einmal sein wird.Dieser Code muss über 3,5 Millionen Zeilen durchlaufen, wie kann ich ihn effizienter machen?
Die csv sieht aus wie
age9tlg,
rigfh34,
...
Hier ist mein Code:
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);
Ist dieser Code geht auf einen Teil des Weges durch mich sterben? Werden mein Speicher und die maximale Ausführungszeit hoch genug sein?
Hinweis: Dieser Code wird auf meinem lokalen Host ausgeführt, und die Datenbank befindet sich auf demselben PC, so dass die Latenz kein Problem ist.
Update:
hier ist eine weitere mögliche Implementierung. Dies tut man es in loser Schüttung Einsätze von 2000 Aufzeichnungen
$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);
wenn ich diese Methode zu verwenden, was der höchste Wert ist ich es auf einmal einzufügen setzen könnte?
Update 2
so fand ive i
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`)
verwenden können, aber das Problem ist jetzt, dass ich über das CSV-Format falsch war, es ist tatsächlich 4-Codes und dann ein Zeilenumbruch, so fhroflg, qporlfg, vcalpfx, rplfigc,
vapworf, flofigx, apqoeei, clxosrc,
...
also muss ich in der Lage sein, zwei LINES TERMINATED BY
diese Frage wurde verzweigt zu Here.
Update 3
einstellen es bulk Einsätze von 20k Reihen zu tun,
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
verwenden, aber es stirbt an dieser Stelle, weil aus irgendeinem Grund $ val enthält 75k Zeilen und Idee, warum?
Beachten Sie, dass der obige Code vereinfacht ist.
Es sollte offensichtlich sein, dass es extrem ineffizient ist, 3,5 Millionen Datensätze nacheinander einzufügen. SQL Server verfügt über eine spezielle Bulk-Copy-Semantik für große Masseneinfügungen. Sie sollten nach etwas Ähnlichem in MySQL suchen. – mquander
Sie könnten es durch Teile wie X Anzahl der Einträge alle X Minuten ausführen, wenn Sie nicht alle auf einmal ausführen müssen. http://dev.mysql.com/doc/refman/5.0/en/mysqlimport.html – Prix
Also, ich habe versucht, eine Masseneinfügung auf 200k Reihen, yeah interessanter Fehler; MySQL-Server ist weg lol – Hailwood