Codeigniter Erlaubte Speichergröße bei der Verarbeitung großer Dateien erschöpft

8

Ich poste das für den Fall, dass jemand anderes nach der gleichen Lösung sucht, da ich gerade zwei Tage mit diesem Schwachsinn verschwendet habe.

Ich habe einen Cron-Job, der die Datenbank einmal täglich unter Verwendung einer sehr großen Datei mit dem folgenden Code aktualisiert:

%Vor%

Dies ist in einem Codeigniter-Controller, der nur für Cron-Jobs verwendet wird. Die $ this- & gt; regen-Funktion durchläuft eine Reihe verschiedener Prüfungen und speichert die richtigen Informationen aus der Zeile in der Datenbank. Die Datei selbst besteht aus über 300 MB JSONs, die durch Zeilenumbrüche getrennt sind.

Das Problem: es würde nur ungefähr 20.000 Zeilen verarbeiten, bevor dem ganzen Ding der Speicher ausging.

    
Cryan 22.03.2014, 20:36
quelle

1 Antwort

10

Ich habe Stunden damit verbracht, das Problem zu beheben und habe nichts Offensichtliches bekommen. Ich benutze fgets, ich habe $ query- & gt; free_result () an den richtigen Stellen. Es hat nicht geholfen. Also habe ich angefangen, eine Schleife von ungefähr 100 Zeilen zu prüfen und habe die Ausgabe von memory_get_usage () beobachtet. Ich habe es schließlich auf die Klasse Active Codingigner Active Record eingegrenzt - jeder Aufruf der Klasse hat die Speicherbelegung um einen winzigen Betrag erhöht.

Dann fand ich diesen Thread auf Ellislabs und bekam die Antwort. CI Active Record speichert Abfragen, sodass Sie bei Bedarf eine Abfrage in mehreren Funktionen erstellen können. (Ich werde nicht einmal darauf eingehen, wie dumm es ist, das standardmäßig eingeschaltet zu haben.)

Gehe zu /config/database.php und füge

hinzu

$db['default']['save_queries'] = FALSE;

bis zum Ende der Datei. Stellen Sie dann sicher, dass Sie Abfragen mit Active Record in einer einzigen Funktion erstellen und ausführen. Wenn Sie es nur für einen Fall ausschalten müssen, verwenden Sie

$this->db->save_queries = FALSE;

im Konstruktor oder wo immer Sie es einfügen müssen.

    
Cryan 25.03.2014, 15:38
quelle