2017-10-15 1 views
0

Können Sie mir bitte mit Ideen zu parsen und kombinieren etwa 12 xml-Dateien, jede Datei hat ~ 5 Mega, um schließlich eine einzige globale Datei zu haben.Analysieren und kombinieren Sie viele XML-Dateien, nicht genügend Speicher

Derzeit ich einen cron verwenden, um ein Skript (ein symfony Framework-Befehl)

Für jede Datei, die ich deserialisieren es mit dem Bündel JMSSerializerBundle ausführen kann, ermöglicht es, ein Objekt aus einer XML-Datei zu erstellen.

Und ich habe ein Speicherproblem. Ich denke, das liegt an dieser Deserialisierung.

Also meine Fragen sind,

  • Kennen Sie einen besseren Weg, um dieses stup zu tun, wenn ich durch eine Analyse mit SimpleXML diese Deserialisierung mit diesem Bündel ersetzen, denken Sie, es weniger Speicher verbraucht?

  • Auch, wenn ich die Dateien in Variablen speichern Redis ändert es nichts?

  • Und eine letzte Frage, wenn ich zum Beispiel die Datenbank verwende, speichere ich die Dateien in einer Tabelle, dann ich alle Datensätze in einer Tabelle abrufen und damit die globale XML-Datei erstellen, kann es sein eine gute Idee? Oder erstellen Sie die globale Datei in mehreren Schritten (mit jeweils 3 Dateien), speichern Sie sie jedes Mal in einer Tabelle und Daten jedes Mal in einem einfachen Array abrufen.

Vielen Dank für Ihre Hilfe.

+1

Wenn Sie Probleme mit dem Speicher mit SimpleXML haben, sollten Sie wahrscheinlich einen Pull-Parser wie [XMLReader] (http://www.php.net/manual/en/class.xmlreader.php) –

+0

Eine Kombination verwenden XMLReader und XMLWriter sollten in der Lage sein, die gesamte Datei auf einmal zu erstellen. Dies hängt von der Verarbeitungsmenge ab, die Sie in der Zwischenzeit mit den Daten machen müssen. Sie können sie möglicherweise in einem Durchgang in die Pipeline leiten. –

+0

Ja, ich werde XMLReader verwenden, danke Jungs. – sakados

Antwort

0

Wenn dies ein einem der Aufgabe ist, die über die Kommandozeile ausgeführt wird Sie mit der Einstellung wegkommen könnte der Lage sein, PHP memory_limit zu -1ini_set('memory_limit', -1); am Anfang Ihrer CLI-Skript.

Dies ist offensichtlich keine Option für Anfragen, da eine einzige Anfrage den gesamten Speicher des Systems beschädigen könnte. Beachten Sie außerdem, dass Sie offensichtlich immer noch an den verfügbaren Systemspeicher gebunden sind, sodass das Problem möglicherweise weiterhin auftritt.

Wie bereits in den Kommentaren vorgeschlagen, können Sie die Speicherauslastung möglicherweise reduzieren, indem Sie einen Pull-Parser wie XMLReader verwenden. Das wird die Menge an Speicher reduzieren, die beim Lesen der XML verbraucht wird, aber offensichtlich werden die gelesenen Daten (wahrscheinlich in einem Array) immer noch akkumulieren. Wenn Sie nicht die neueste PHP-Version verwenden, ist dies wahrscheinlich der einfachste Weg, die Speichernutzung dort zu optimieren.

Ansonsten empfehle ich, ein Tool wie xhprof oder blackfire.io zu verwenden, um die Speichernutzung Ihres Skripts zu profilieren und die Hauptprobleme zu beheben, die von ihnen angezeigt werden.

+0

Danke dbrumann für diese Erklärung :) – sakados

Verwandte Themen