2017-09-29 2 views
2

J'ai le problème suivant. Je travaille avec une petite machine avec peu de mémoire (1 Go). mon programme télécharger un énorme fichier gzip à partir d'une URL. Et je dois décompresser à dict Je sais avec certitude que le fichier est au format json. Mon problème est que quand je lance la commande suivante je suis une erreur de mémoire :décompression énorme fichier gzip json provoquant une erreur de mémoire en python

data = zlib.decompress(url, 16 + zlib.MAX_WBITS).decode('utf8') 
results_list.append(json.loads(data)) 

maintenant pour les petits fichiers, cela fonctionne très bien, mais pour les grands que je suis l'erreur. mon intuition me dit que je devrais diviser le fichier en morceaux, mais parce que je m'attends à un fichier json, je ne pourrai pas restaurer les morceaux en json (car chaque partie ne sera pas une chaîne json valide).

que dois-je faire?

Merci beaucoup!

+0

Pas besoin de le fendre dans les mandrins: utilisez une poignée plutôt qu'une ficelle. –

+0

@WillemVanOnsem pouvez-vous élaborer s'il vous plaît gérer où? – misha312

+0

un corps? Je suis totalement perdu ... – misha312

Répondre

1

Créer un objet de décompression en utilisant z=zlib.decompressobj(), puis faire z.decompress(some_compressed_data, max), qui retournera pas plus de max octets de données non compressées. Vous appelez ensuite à nouveau avec z.decompress(z.unconsumed_tail, max) jusqu'à ce que le reste de some_compressed_data soit consommé, puis alimentez plus de données compressées.

Vous devrez ensuite pouvoir traiter les données non compressées résultantes en un morceau à la fois.

+0

Salut merci beaucoup ... pouvez-vous s'il vous plaît expliquer ce que vous recommanderiez pour la valeur de max? et comment j'accède aux données décompressées, et comment je peux dire s'il y a un unconsumed_tail. – misha312