J'ai un grand ensemble de données (millions de lignes) en mémoire, sous la forme de tableaux numpy et dictionnaires.
Une fois ces données construites, je veux les stocker dans des fichiers; ainsi, plus tard, je peux charger ces fichiers en mémoire rapidement, sans reconstruire ces données à partir de zéro.
np.save et np.load les fonctions font le travail en douceur pour les tableaux numpy.
Mais j'ai des problèmes avec les objets dict.
Voir l'exemple ci-dessous. d2 est le dictionnaire qui a été chargé à partir du fichier. Voir #out [28] il a été chargé dans d2 en tant que tableau numpy, pas en tant que dict. Ainsi, les autres opérations de dict telles que get ne fonctionnent pas.
Existe-t-il un moyen de charger les données du fichier en tant que dict (au lieu d'un tableau numpy)?
In [25]: d1={'key1':[5,10], 'key2':[50,100]}
In [26]: np.save("d1.npy", d1)
In [27]: d2=np.load("d1.npy")
In [28]: d2
Out[28]: array({'key2': [50, 100], 'key1': [5, 10]}, dtype=object)
In [30]: d1.get('key1') #original dict before saving into file
Out[30]: [5, 10]
In [31]: d2.get('key2') #dictionary loaded from the file
---------------------------------------------------------------------------
AttributeError Traceback (most recent call last)
<ipython-input-31-23e02e45bf22> in <module>()
----> 1 d2.get('key2')
AttributeError: 'numpy.ndarray' object has no attribute 'get'
C'est un tableau structuré. Utilisez d2.item()
pour récupérer d'abord l'objet dict réel:
import numpy as np
d1={'key1':[5,10], 'key2':[50,100]}
np.save("d1.npy", d1)
d2=np.load("d1.npy")
print d1.get('key1')
print d2.item().get('key2')
résultat:
[5, 10]
[50, 100]
pickle module peut être utilisé. Exemple de code:
from six.moves import cPickle as pickle #for performance
from __future__ import print_function
import numpy as np
def save_dict(di_, filename_):
with open(filename_, 'wb') as f:
pickle.dump(di_, f)
def load_dict(filename_):
with open(filename_, 'rb') as f:
ret_di = pickle.load(f)
return ret_di
if __name__ == '__main__':
g_data = {
'm':np.random.Rand(4,4),
'n':np.random.Rand(2,2,2)
}
save_dict(g_data, './data.pkl')
g_data2 = load_dict('./data.pkl')
print(g_data['m'] == g_data2['m'])
print(g_data['n'] == g_data2['n'])
Vous pouvez également enregistrer plusieurs objets python dans un seul fichier mariné. Chaque pickle.load
l'appel chargera un seul objet dans ce cas.