MemoryError avec Cornichon en Python

Je suis de traitement de certaines données et je stocke les résultats dans les trois dictionnaires, et je l'ai enregistré sur le disque avec la saumure. Chaque dictionnaire a 500-1 000 MO.

Maintenant, je suis de chargement:

import pickle
with open('dict1.txt', "rb") as myFile:
    dict1 = pickle.load(myFile)

Cependant, déjà, lors du chargement, le premier dictionnaire-je obtenir:

*** set a breakpoint in malloc_error_break to debug
python(3716,0xa08ed1d4) malloc: *** mach_vm_map(size=1048576) failed (error code=3)
*** error: can't allocate region securely
*** set a breakpoint in malloc_error_break to debug
Traceback (most recent call last):
  File "/System/Library/Frameworks/Python.framework/Versions/2.7/lib/python2.7/pickle.py", line 858, in load
    dispatch[key](self)
  File "/System/Library/Frameworks/Python.framework/Versions/2.7/lib/python2.7/pickle.py", line 1019, in load_empty_dictionary
    self.stack.append({})
MemoryError

Comment résoudre ce problème? Mon ordinateur a 16 go de RAM donc je trouve ça étrange que le chargement d'un 800 MO dictionnaire se bloque. Ce que je trouve surprenant, c'est qu'il n'y avait pas de problèmes lors de l'enregistrement des dictionnaires.

De plus, à l'avenir, je prévois de traiter plus de données résultant dans les grands dictionnaires (3-4 GO sur le disque), donc, tous les conseils pour améliorer l'efficience est apprécié.

Quel système d'exploitation utilisez-vous? Est la taille de la sur le disque la taille du fichier ou n'avez-vous mesurer la réelle utilisation de la mémoire?
Cela dépend de votre système d'exploitation, la quantité de mémoire qu'un processus est autorisé à allouer.
La taille est la taille du fichier sur le disque. Je suis sous Mac OS 10.10. Est-il un moyen de régler la quantité de mémoire est autorisé à allouer?
800 MO de données ne se traduit pas 800 MO de l'utilisation de la mémoire; il pourrait être plus grande ou peut-être petites, mais généralement plus grande. Comment avez-vous produire ces cornichons en premier lieu?
Et comment était votre dict1 alors? Vous devez utiliser le sys.getsizeof() de manière récursive pour obtenir l'empreinte mémoire de l'objet. Cette empreinte est tributaire de l'OS, et si vous utilisez une version 32 bits ou 64 bits processus.

OriginalL'auteur flotr | 2015-01-21