J'ai un grand dictionnaire dont la structure ressemble à:cPickle.load() en python consomme une grande mémoire
dcPaths = {'id_jola_001': CPath instance}
où cpath est une classe d'auto-défini:
class CPath(object):
def __init__(self):
# some attributes
self.m_dAvgSpeed = 0.0
...
# a list of CNode instance
self.m_lsNodes = []
où m_lsNodes est une liste des Nœuds-C:
class CNode(object):
def __init__(self):
# some attributes
self.m_nLoc = 0
# a list of Apps
self.m_lsApps = []
ici, m_lsApps est une liste de CApp, qui est une autre classe d'auto-défini:
class CApp(object):
def __init__(self):
# some attributes
self.m_nCount= 0
self.m_nUpPackets = 0
Je sérialiser ce dictionnaire en utilisant cPickle:
def serialize2File(strFileName, strOutDir, obj):
if len(obj) != 0:
strOutFilePath = "%s%s" % (strOutDir, strFileName)
with open(strOutFilePath, 'w') as hOutFile:
cPickle.dump(obj, hOutFile, protocol=0)
return strOutFilePath
else:
print("Nothing to serialize!")
Il fonctionne très bien et la taille du fichier sérialisé est d'environ 6.8GB. Cependant, lorsque je tente de désérialiser cet objet:
def deserializeFromFile(strFilePath):
obj = 0
with open(strFilePath) as hFile:
obj = cPickle.load(hFile)
return obj
Je trouve qu'il consomme plus de mémoire 90GB et prend beaucoup de temps.
- pourquoi cela se produirait-il?
- Y a-t-il un moyen de l'optimiser?
BTW, j'utilise python 2.7.6
Combien de mémoire le processus a-t-il consommé avant de transférer les données dans le pickle? – WeaselFox
Cela peut dépendre de la façon dont les classes stockées sont définies, donc cela vous aidera si vous ajoutez le code. – bereal
Etes-vous sûr que c'est la désérialisation? La sérialisation est connue pour prendre un peu plus de mémoire pour gérer les références cycliques. – KillianDS