2009-07-08 6 views
4

Laisser tomber mon statut de lurker pour enfin poser une question ...Comment améliorer le temps de chargement XML de PHP?

J'ai besoin de savoir comment je peux améliorer les performances d'un script PHP qui tire ses données à partir de fichiers XML.

Un peu d'histoire:

  • Je l'ai déjà mis en correspondance le goulot d'étranglement à la CPU - mais qui veulent optimiser les performances du script avant de prendre un coup sur les coûts de traitement. Plus précisément, la partie du script la plus consommatrice de CPU est le chargement XML. La raison pour laquelle j'utilise XML pour stocker des données d'objet parce que les données doivent être accessibles via une interface de navigateur Flash, et nous voulons fournir un accès utilisateur rapide dans ce domaine. Le projet n'en est encore qu'à ses débuts, donc si la meilleure pratique serait d'abandonner complètement le XML, ce serait aussi une bonne réponse. Beaucoup de données: Tracer actuellement pour environ 100k objets, mais généralement de petite taille - et ils doivent tous être repris dans le script, à quelques rares exceptions près peut-être. L'ensemble de données ne fera que croître avec le temps. Essais fréquents: Idéalement, nous exécuterions le script ~ 50k fois par heure; De manière réaliste, nous nous contenterions de courses de ~ 1k/h. Ceci, associé à la taille des données, rend l'optimisation des performances absolument indispensable.

  • Déjà effectué une étape d'optimisation consistant à effectuer plusieurs passages sur les mêmes données plutôt que de les charger pour chaque exécution, mais cela prend encore trop de temps. Les analyses doivent généralement utiliser des données "fraîches" avec les modifications effectuées par les utilisateurs.

Répondre

3

Juste pour clarifier: les données que vous chargez proviennent-elles de fichiers XML à traiter dans leur état actuel et sont-elles modifiées avant d'être envoyées à l'application Flash?

Il semble que vous feriez mieux d'utiliser une base de données pour stocker vos données et de les sortir de XML au besoin plutôt que de les lire en XML au préalable; Si la construction des fichiers XML ralentit, vous pouvez mettre en cache les fichiers au fur et à mesure qu'ils sont générés afin d'éviter la génération redondante du même fichier.

+0

C'est ce que j'allais suggérer. +1 – ceejayoz

+0

Oui, les objets 100k sont mieux conservés dans une base de données intégrée, ou un objet dédié si vous pouvez y accéder; alors vous pouvez générer seulement les bits du xml dont le client a besoin. –

+0

Pour clarifier: L'interface Flash et les exécutions sont complètement séparées, sauf que les exécutions modifient certaines données qui seront éventuellement affichées. Mais les exécutions sont indépendantes de si les objets sont ou non interrogés par les utilisateurs. Les données provenant de XML sont dans leur état actuel; lorsqu'il est envoyé à Flash, il n'est pas modifié. Les utilisateurs ont cependant la possibilité d'apporter des modifications aux fichiers chargés via l'interface. La question est, en dépit de l'accès plus rapide de l'utilisateur, est-ce que travailler avec une base de données accélère le * runs *? Nous sommes plus préoccupés par cela actuellement. – Polymeron

1

Si le XML reste, vous pouvez relativement statique, le cache comme un tableau PHP, quelque chose comme ceci:

<xml><foo>bar</foo></xml> 

est mis en cache dans un fichier comme

<?php return array('foo' => 'bar'); 

Il devrait être plus rapide pour PHP d'inclure simplement la version groupée du XML.

+0

C'est une bonne réponse, mais nous le faisons déjà pour plusieurs courses à la fois; On s'attend à ce que le XML ne reste pas particulièrement statique pendant plus de quelques secondes, mais nous laissons passer quelques minutes de changements pour passer quelques tours. Après cela, nous devons prendre tous les changements, ce qui signifie recréer le tableau. Encore très intensif en CPU. – Polymeron

0

~ 1k/heure, 3600 secondes par heure, plus de 3 pistes une seconde (et encore moins 50k/heure) ...

Il y a beaucoup de questions. Certains d'entre eux sont:

  • Votre script php doit-il lire/traiter tous les enregistrements de la source de données pour chaque exécution? Sinon, de quel type de sous-ensemble a-t-il besoin (~ taille, critères, ...)
  • Même question pour l'application flash + qui envoie les données? Le script php? Demande "directe" pour le fichier xml statique complet?
  • Quelles sont les opérations effectuées sur la source de données?
  • Avez-vous besoin d'un mécanisme de concurrence?
  • ...

Et juste parce que vous voulez fournir des données XML aux clients flash, cela ne signifie pas nécessairement que vous devez stocker des données XML sur le serveur. Si par exemple les clients n'ont besoin que d'un petit sous-ensemble des enregistrements disponibles, il est probablement beaucoup plus rapide de ne pas stocker les données en XML, mais quelque chose de plus adapté à la vitesse et à la "recherche" et de créer la sortie XML du sous-ensemble. assisté par un cache en fonction de quelles données la demande du client et comment/combien les données changent.

edit: Supposons que vous ayez vraiment, vraiment besoin de l'ensemble des données et que vous ayez besoin d'une simulation continue. Ensuite, vous pourriez envisager un processus continu qui garde en mémoire le «modèle mondial» complet et qui fonctionne sur ce modèle à chaque exécution (tick du monde). De cette façon au moins vous n'auriez pas à charger les données sur chaque tick. Mais un tel processus est généralement écrit dans autre chose que PHP.

+0

Pour clarifier, les exécutions devraient fonctionner en tâche de fond, en traitant les données qui seront finalement affichées aux utilisateurs. - Nous aurons besoin des données de chaque objet pour chaque exécution. - Lorsque les utilisateurs visualisent l'interface, l'interface appelle des fichiers XML spécifiques afin de savoir quoi afficher. - Pas besoin de mécanismes de concurrence - nous sommes d'accord sur ce front, je pense. La facilité de recherche est bonne pour les utilisateurs, mais l'utilisation de la base de données serait-elle plus efficace pour les exécutions en arrière-plan? C'est la préoccupation actuelle. – Polymeron

+0

Si c'est un processus d'arrière-plan, pourquoi avez-vous besoin de lire/charger l'ensemble du jeu de données à plusieurs reprises? Si vous dites que vous devez nous devons probablement vous croire ;-) mais plusieurs fois une telle question est posée dans les forums php, elle se résume à "non, vous n'avez pas besoin d'une simulation (presque) continue pour cela". Pouvez-vous être plus précis sur l'ensemble de données et les opérations que vous voulez effectuer à chaque exécution? – VolkerK

+0

Ensuite, je voudrais essayer de se débarrasser des fichiers ou au moins des opérations de chargement répétées. C'est à dire. un processus en cours d'exécution qui a) fait la simulation, b) accepte et sert les demandes pour les sous-ensembles de données et c) traite les demandes de modification des données. Ainsi, au lieu de télécharger un fichier (qui est stocké en tant que fichier sur le serveur), ce processus intégrerait les nouvelles données dans son modèle mondial (et probablement le stocker dans une base de données en tant que sauvegarde) – VolkerK

Questions connexes