Traitement de fichiers JSON volumineux en PHP
Je suis en train de traiter un peu grand (peut-être jusqu'à 200 M) des fichiers JSON.
La structure du fichier est en fait un tableau d'objets.
Si quelque chose le long des lignes de:
[
{"property":"value", "property2":"value2"},
{"prop":"val"},
...
{"foo":"bar"}
]
Chaque objet a des propriétés arbitraires et n'est pas nécessaire de les partager avec d'autres objets dans le tableau (comme dans l', ayant les mêmes).
Je veux appliquer un traitement sur chaque objet du tableau et que le fichier est potentiellement énorme, je ne peux pas slurp l'ensemble du contenu d'un fichier en mémoire, le décodage du JSON et de parcourir le tableau PHP.
Donc, idéalement, je voudrais lire le fichier, extraire suffisamment d'informations pour chaque objet et chaque processus.
Un SAX-type d'approche serait OK si il y avait une bibliothèque semblable disponible pour JSON.
Toute suggestion sur la façon de traiter ce problème le mieux?
source d'informationauteur The Mighty Rubber Duck
Vous devez vous connecter pour publier un commentaire.
J'ai décidé de travailler sur un événement à partir de l'analyseur. Ce n'est pas tout à fait fini encore et de modifier la question avec un lien vers mon travail quand j'ai rouler une bonne version.
EDIT:
J'ai finalement travaillé sur une version de l'analyseur que je suis satisfait. Il est disponible sur GitHub:
https://github.com/kuma-giyomu/JSONParser
Il y a probablement une marge d'amélioration et reçois des commentaires.
J'ai écrit un flux JSON pull analyseur pcrov/JsonReader pour PHP 7, avec une api basée sur XMLReader.
Il diffère sensiblement de cas basée sur des analyseurs en ce qu'au lieu de créer des rappels et de laisser l'analyseur faire sa chose, vous appeler des méthodes sur l'analyseur de bouger ou de récupérer des données comme vous le souhaitez. Trouvé souhaitée bits et que vous voulez arrêter l'analyse? Alors arrêter de l'analyse (et appel
close()
parce que c'est la bonne chose à faire.)(Pour un peu plus de vue d'ensemble de la traction vs basés sur des événements, des analyseurs de voir Lecteur XML modèles: SAX rapport à XML pull analyseur.)
Exemple 1:
Lire chaque objet comme un tout à partir de votre JSON.
De sortie:
Des objets retournés comme stringly assortie de tableaux à cause (en partie) à bord des cas où JSON valide serait de produire des noms de propriété qui ne sont pas autorisés dans les objets PHP. Travail autour de ces conflits n'est pas la peine, une anémie objet stdClass apporte pas de valeur à un tableau simple de toute façon.
Exemple 2:
Lire chaque élément nommé individuellement.
De sortie:
Exemple 3:
Lire chaque propriété d'un nom donné. Bonus: lire un chaîne de caractères au lieu d'un URI, ainsi que d'obtenir des données à partir des propriétés avec des noms identiques dans le même objet (ce qui est permis en JSON, comment s'amuser.)
De sortie:
Comment faire exactement pour mieux lire votre JSON dépend de sa structure et de ce que vous voulez faire avec elle. Ces exemples devraient vous donner un endroit pour commencer.
Il existe quelque chose comme cela, mais seulement pour C++ et Java. Sauf si vous pouvez accéder à l'une de ces bibliothèques à partir de PHP, il n'y a pas de mise en œuvre de ce en PHP mais
json_read()
autant que je sache. Toutefois, si le json est structuré de manière simple, il est facile de lire le fichier jusqu'à la prochaine}
et ensuite traiter le JSON reçus par l'intermédiaire dejson_read()
. Mais il vaut mieux le faire tampon, comme la lecture des 10 kio, divisé par }, si pas trouvé, lire un autre 10k, et d'autre processus de l'valeurs. Puis lire le bloc suivant et ainsi de suite..C'est simple, streaming analyseur pour le traitement de grandes JSON documents. L'utiliser pour l'analyse de très grands JSON documents, afin d'éviter le chargement de l'ensemble de la chose en mémoire, ce qui est la façon dont à peu près tous les autres parser JSON pour PHP fonctionne.
https://github.com/salsify/jsonstreamingparser
Il est http://github.com/sfalvo/php-yajl/ je n'ai pas utilisé moi-même.