Das folgende PHP-Skript wird derzeit auf einer c3.large EC2-Instanz mit Instanzspeicher und einer SSD-Halterung für MySQL gehostet. Die Datei, die das Skript liest, befindet sich auf einem der Instanzspeichergeräte.
Wenn das Skript startet, läuft es wie erwartet mit 100 %, nach ein paar Stunden verlangsamt sich die Geschwindigkeit jedoch auf etwa 5 %, wodurch die MySQL-Einfügungen letztendlich fast zum Erliegen kommen.
Irgendwelche Ideen, was diesen Prozess verlangsamt? Ist es möglicherweise ein IOPS-Problem?
$handle = fopen(TMP . 'zones/' . $destinationFile, 'r');
if ($handle) {
$x = 0;
$origin = '';
while (($line = fgets($handle)) !== false) {
$x = $x + 1;
$line = str_replace("\r", '', $line);
$line = str_replace("\n", '', $line);
if ($x > 61) {
$record = explode(' ', $line);
switch ($record[1]) {
case 'NS':
$domain = $record[0];
$nameserver = rtrim($record[2], '.');
if ($record[2] == $nameserver) {
$nameserver = $nameserver . '.' . $origin;
}
$domainId = $this->addDomain($domain, $origin);
$nameserverId = $this->addNameserver($nameserver);
$dnId = $this->addDomainNameserver($domainId, $nameserverId);
break;
case 'A':
echo 'Nameserver IP: ' . $record[2];
break;
}
} else {
if (strpos($line, '$ORIGIN') > -1) {
$origin = str_replace('$ORIGIN ', '', $line);
$origin = rtrim($origin, '.');
}
}
}
fclose($handle);
}
Antwort1
Fragen Sie lieber bei StackOverflow nach ... Sie erwähnen MySQL-Einfügungen, aber ich sehe in Ihrer Frage keinen SQL-Code. Normalerweise, wenn Sie große Datenmengen in eine Datenbank einfügen:
1) Sie führen nicht eine Anforderung pro Zeile aus. 2) Sie führen von Zeit zu Zeit ein COMMIT aus, da die Datenbank sonst alle Ihre Daten in einem temporären Puffer speichern muss. 3) Sie führen aber auch kein COMMIT für jede Zeile aus, da dies teuer ist. Normalerweise geben Sie die Daten in Stapeln mit mehreren Tausend Zeilen ein.
Auch MySQL und andere DBMS bieten Möglichkeiten, große Tabellen aus Dateien aufzunehmen (sieheLOAD DATA
in SQLoder der mysqlimport
Befehl), sodass Ihr Skript diese Zwischendatei erstellen und dann MySQL aufrufen kann, um sie in einem Durchgang zu laden.