Frage

ich heruntergeladen eine Datenbank, die auf das TXT-Format exportiert wurde und hat etwa 700 MB mit 7 Millionen Datensätze (1 pro Zeile). Ich habe ein Skript, um die Daten zu einer MySQL-Datenbank zu importieren, aber wenn etwa 4 Millionen Datensätze in eingefügt, stürzt der Browser. Ich habe in Firefox und IE getestet. Kann mir jemand eine Meinung geben und einige Ratschläge über das?

Das Skript ist dies:

<?php
set_time_limit(0);
ini_set('memory_limit','128M');

$conexao = mysql_connect("localhost","root","") or die (mysql_error());
$base = mysql_select_db("lista102",$conexao) or die (mysql_error());
$ponteiro = fopen("TELEFONES_1.txt","r");
$conta = 0;
function myflush(){ ob_flush(); flush(); }

while(!feof($ponteiro)){
    $conta++;

    $linha = fgets($ponteiro,4096);
    $linha = str_replace("\"", "", $linha);
    $arr = explode(";",$linha);
    $sql = "insert into usuarios (CPF_CNPJ,NOME,LOG,END,NUM,COMPL,BAIR,MUN,CEP,DDD,TELEF) values ('".$arr[0]."','".$arr[1]."','".$arr[2]."','".$arr[3]."','".$arr[4]."','".$arr[5]."','".$arr[6]."','".$arr[7]."','".$arr[8]."','".$arr[9]."','".trim($arr[10])."')";
    $rs = mysql_query($sql);
    if(!$rs){ echo $conta ." error";}

    if(($conta%5000)==4999) { sleep(10); echo "<br>Pause: ".$conta; }
    myflush();
}

echo "<BR>Eof, import complete";
fclose($ponteiro);
mysql_close($conexao);
?>
War es hilfreich?

Lösung

Versuchen Sie die Datei in 100 MB Stücke aufzuteilen. Dies ist eine schnelle Lösung Vorschlag die Aufgabe zu erledigen. Der Browser Problem kann kompliziert zu lösen. Versuchen Sie auch verschiedenen Browser.

phpMyadmin hat Optionen, um die Abfrage fortzusetzen, wenn ein Absturz passiert ist. Ermöglicht Unterbrechungen bei Import, falls das Skript erkennt es zu Zeitlimit liegt. Dies könnte eine gute Möglichkeit, große Dateien zu importieren, aber es kann Transaktionen brechen.

Andere Tipps

Ich bin mir nicht sicher, warum Sie einen Web-Browser, um Datensätze in mysql einzufügen. Warum nicht nur die Einfuhrmöglichkeiten der Datenbank nutzen, um sich und lassen Sie die Bahn aus ihm heraus?

Wenn das nicht möglich ist, würde ich frage mich, ob die Einsätze in Gruppen von 1000 Chunking in einer Zeit helfen würde. Anstatt die gesamte Datenbank als eine einzelne Transaktion zu begehen, würde ich es zu brechen empfehlen nach oben.

Sind Sie InnoDB mit?

  1. Was habe ich zum ersten Mal bemerkt, ist, dass man flush () unsafely verwenden. Doing flush (), wenn der httpd Puffer voll Ergebnis in einem Fehler ist und Ihr Skript stirbt. Aufgeben all diese myflush () Abhilfe und verwenden einen einzigen ob_implicit_flush() statt.

  2. Sie müssen nicht mit Ihrem Browser zu sehen, um es zu Ende zu machen zu arbeiten, können Sie einen ignore_user_abort() platzieren, damit Ihr Code wird seine Arbeit abzuschließen, auch wenn Ihr Browser stirbt.

  3. Nicht sicher, warum Ihr Browser stirbt. Vielleicht ist Ihr Skript zu viel Inhalt zu erzeugen.

Versuchen Sie es mit no


Pause: nnnn

Ausgabe an den Browser, und sehen, ob das hilft. Es kann einfach sein, dass der Browser auf der langen Seite, erstickt es gefragt ist zu machen.

Auch ist PHP Timing während des langen Transfers aus?

Es hilft nicht, auch, dass Sie schlafen (10) zu der Zeit es braucht.

Sie können versuchen, die Datei in verschiedenen TXT-Dateien Aufspaltung, und wiederholen Sie den Vorgang, die Dateien mit. Ich weiß, dass ich zumindest den Ansatz einmal.

Der Browser Würgen, weil die Anfrage zu lange dauert, ist abgeschlossen. Gibt es einen Grund dieser Prozess Teil einer Web-Seite enthalten sein sollte? Wenn Sie absolut es auf diese Weise zu tun haben, sollten Sie Ihre Daten in überschaubare Einheiten Aufspaltung.

Führen Sie den Code in der Befehlszeile PHP-CLI verwenden. Auf diese Weise werden Sie nie Timeout für lange laufenden Prozess begegnen. die Situation ist Ihr Browser abstürzen, bevor die Zeit-out ^^ Obwohl. Wenn Sie in Hosting-Server auszuführen versuchen, die Sie nicht Shell-Zugriff haben, führen Sie den Code mit crontab. Aber, müssen Sie sicherstellen, dass die crontab nur einmal ausführen

Lizenziert unter: CC-BY-SA mit Zuschreibung
Nicht verbunden mit StackOverflow
scroll top