2017-10-15 6 views
0

Pouvez-vous m'aider s'il vous plaît avec des idées pour être en mesure d'analyser et de combiner environ 12 fichiers xml, chaque fichier a ~ 5 méga, pour finalement avoir un seul fichier global.Parse et combiner de nombreux fichiers xml, mémoire insuffisante

Actuellement, j'utiliser un cron pour exécuter un script (une commande framework symfony)

Pour chaque fichier que je deserialize avec le faisceau JMSSerializerBundle, il permet de créer un objet à partir d'un fichier xml.

Et j'ai un problème de mémoire. Je pense que cela est dû à cette désérialisation.

Mes questions sont,

  • Connaissez-vous une meilleure façon de le faire stup, si je remplace ce désérialisation avec cet ensemble par une analyse syntaxique avec SimpleXML, pensez-vous qu'il consomme moins de mémoire?

  • De même, si je sauvegarde les fichiers dans des variables, Redis change-t-il quelque chose? Et, une dernière question, si j'utilise la base de données, par exemple, je sauvegarde les fichiers dans une table, puis je récupère tous les enregistrements dans une table et avec cela je construis le fichier xml global, peut-il être une bonne idée? Ou créez le fichier global en plusieurs étapes (avec 3 fichiers à chaque fois), enregistrez-le à chaque fois dans une table et récupérez les données à chaque fois dans un tableau simple.

Merci beaucoup pour votre aide.

+1

Si vous rencontrez des problèmes de mémoire avec SimpleXML, vous devriez probablement passer à l'utilisation d'un analyseur d'extraction comme [XMLReader] (http://www.php.net/manual/en/class.xmlreader.php) –

+0

Une combinaison de XMLReader et XMLWriter devrait être capable de vous permettre de construire le fichier entier en une fois. Cela dépend de la quantité de traitement que vous avez à faire avec les données entre temps, vous pouvez être en mesure de les canaliser tous les deux en une seule fois. –

+0

Oui, je vais utiliser XMLReader merci les gars. – sakados

Répondre

0

Si cela est une des tâches qui se fait via la ligne de commande que vous pourriez être en mesure de sortir avec la mise de PHP memory_limit à l'aide -1ini_set('memory_limit', -1); au début de votre CLI-script.

Il ne s'agit évidemment pas d'une option pour les demandes, car une seule requête pourrait bloquer toute la mémoire du système. Notez également que vous êtes toujours lié par la mémoire système disponible, vous risquez donc toujours de rencontrer ce problème.

Comme déjà suggéré dans les commentaires, vous pourriez être en mesure de réduire l'utilisation de la mémoire en utilisant un analyseur de pull comme XMLReader. Cela réduira la quantité de mémoire utilisée en lisant le XML, mais évidemment, le fait de conserver les données lues (probablement dans un tableau) s'accumulera toujours. Si vous n'utilisez pas la dernière version de PHP, c'est probablement le moyen le plus simple d'optimiser l'utilisation de la mémoire. Sinon, je recommande d'utiliser un outil comme xhprof ou blackfire.io pour profiler l'utilisation de la mémoire de votre script et essayer de résoudre les principaux problèmes signalés par eux.

+0

Merci dbrumann pour cette explication :) – sakados