124 votes

Lecture de fichiers JSON assez volumineux

J'ai quelques gros fichiers encodés en json. Le plus petit fait 300 Mo ; les autres font plusieurs Go, de 2 Go à plus de 10 Go.

Il semble que je manque de mémoire lorsque j'essaie de charger les fichiers dans Python.

J'ai essayé d'utiliser ce code pour tester les performances :

from datetime import datetime
import json

print datetime.now()

f = open('file.json', 'r')
json.load(f)
f.close()

print datetime.now()

Il n'est pas surprenant que cela provoque une MemoryError . Il apparaît que json.load() appels json.loads(f.read()) qui essaie d'abord de transférer l'intégralité du fichier en mémoire, ce qui ne fonctionnera manifestement pas.

Comment puis-je résoudre ce problème proprement ?


Je sais que cette question est ancienne, mais je ne pense pas qu'il s'agisse d'un doublon. La réponse est la même, mais la question est différente. Dans le "duplicata", la question est de savoir comment lire efficacement de gros fichiers, alors que cette question porte sur des fichiers qui ne tiennent même pas du tout dans la mémoire. L'efficacité n'est pas nécessaire.

125voto

Lattyware Points 37257

Le problème est que JSON, en tant que format, est généralement analysé dans son intégralité, puis traité en mémoire, ce qui est manifestement problématique pour un volume de données aussi important.

La solution consiste à travailler avec les données sous forme de flux - en lisant une partie du fichier, en la traitant, puis en répétant l'opération.

La meilleure option semble être d'utiliser quelque chose comme ijson - un module qui travaillera avec JSON en tant que flux, plutôt qu'en tant que fichier bloc.

Edit : vaut également la peine d'être regardé - Commentaire de Kashif à propos de json-streamer y Commentaire de Henrik Heino à propos de bigjson .

Prograide.com

Prograide est une communauté de développeurs qui cherche à élargir la connaissance de la programmation au-delà de l'anglais.
Pour cela nous avons les plus grands doutes résolus en français et vous pouvez aussi poser vos propres questions ou résoudre celles des autres.

Powered by:

X