2011-01-11 5 views
2

Je veux vérifier un poste de blog pour les occurrences de mots étrangers spécifiques, puis lier ces mots à des fichiers sonores afin qu'ils puissent être joués.Le moyen le plus efficace pour stocker et parcourir ces données?

J'ai un fichier XML avec 2500 mots pour lesquels j'ai des fichiers audio, et je me demande quel est le meilleur moyen de stocker et de parcourir cette liste? La liste n'est pas susceptible de changer, et la fonction sera exécutée sur chaque article de blog quand il est vu en entier (pas quand des extraits sont affichés sur des pages d'archives, etc.).

Le fichier XML est de 350 Ko, que je chargeais en PHP avec simplexml_load_file. Je pensais que c'était un peu grand, donc je l'ai converti en un fichier PHP contenant un tableau indexé (par chaîne) des mots, ce qui ramène la taille du fichier à environ 60 Ko.

Dois-je me soucier autant de la taille du fichier, ou plus sur combien de temps il faudra pour rechercher dans les données? Y a-t-il une meilleure façon de le faire ou serait-ce mieux dans une base de données? Toute aide serait appréciée!

+0

Est-ce une option pour mettre en mémoire cache les données en utilisant memcached? – Sairam

Répondre

3

Si vous trouvez l'analyse syntaxique et l'appariement du fichier XML par rapport au blogpost dans un délai raisonnable, il n'est pas nécessaire d'optimiser. Optimisez lorsque vous remarquez un impact négatif significatif.

L'approche la plus simple serait probablement de simplement mettre en cache les pages traitées. Chaque fois que l'article de blog ou la liste de mots change, le cache est invalidé, de sorte qu'il est traité à nouveau la prochaine fois qu'il est appelé.

+2

+1 - cache en particulier les données ne sont pas énormes – ajreal

0

La conversion de votre fichier en un tableau PHP est tout simplement géniale (vous ne pouvez pas faire mieux que ce que cela en termes de performances, à moins d'écrire votre propre extension). Non seulement le fichier d'entrée est plus petit, mais vous avez également pris en charge une étape d'analyse XML assez lourde (par rapport à vos autres opérations).

Une objection pourrait avoir été soulevée car un tableau vous forcera à lire toutes les données en même temps, mais pesant 60K ce n'est pas un problème. En ce qui concerne la recherche des données, étant donné que les tableaux PHP sont associatifs, ils offrent de très bonnes performances dans ce type de scénario.

Dans l'ensemble, je dirais que votre approche est la bonne.

+1

"une jolie étape d'analyse syntaxique XML [...]" ... et l'a remplacée par une jolie étape d'analyse PHP. Ou comment pensez-vous, l'interprète PHP apprend à faire quoi? En fait, un bon analyseur de flux XML comme Expat pourrait être la meilleure solution, hormis le stockage des valeurs dans une base de données. – Boldewyn

+0

@Boldewyn: Certes, il y aurait un coût d'analyse PHP. Je crois que ce serait beaucoup plus rapide (si rien d'autre, 350 Ko vs 60 Ko pour analyser), plus il serait possible de mettre en cache les opcode.Basé sur l'expérience, je pense toujours que c'est la meilleure façon de mettre en cache le résultat final lui-même. – Jon

+0

J'étais préoccupé par le temps qu'il faudrait pour analyser le tableau, je fais essentiellement "if (! Empty ($ words [$ match]))" pour vérifier si le mot existe dans le tableau. – iamdarrenhall

0

L'indexation basée sur le tableau de mots stockés dans un fichier prend beaucoup de temps que la recherche dans le fichier XML.

+2

c'est totalement faux. – Jon

0

Sans doute la solution la plus extensible à ceci est d'utiliser une base de données. Cela peut gérer d'énormes quantités de données sans perte significative de performances, donc si vous aviez plus de données à l'avenir, il serait trivial de l'ajouter. Dans ce cas, vous pouvez utiliser sqlite, ce qui nécessite relativement peu d'installation et de configuration, tout en étant assez rapide et puissant.

Votre solution utilisant un tableau PHP (vraisemblablement en utilisant include/require) est une bonne solution, et je ne m'inquiéterais pas trop de la changer. Vous avez cependant absolument raison de perdre le fichier XML. Ce serait à la fois excessivement laborieux et lent.

Questions connexes