J'ai un énorme tableau numd 2d qui est censé fonctionner comme une matrice de co-occurrence. J'ai essayé d'utiliser scipy.sparse comme structure de données, mais l'indexation dok_matrix
est incroyablement lente (4x fois plus lente).Python: Comment enregistrer 2d tableau numpy efficacement sur le disque?
# Impossible
import numpy
N = 1000000 (1 milion)
coo = np.zeros((N, N), dtype=np.uint32)
Je souhaite conserver ce tableau. Après avoir cherché des façons de le sauvegarder, j'ai essayé d'utiliser PyTables
ou hd5py
, mais je n'ai pas trouvé un moyen de l'enregistrer sans manquer de mémoire.
with open(name, 'w') as _file:
np.save(_file, coo)
Par exemple, en utilisant PyTables
:
import tables
_file = tables.openFile(
name,
mode='w',
title='Co-occurrence matrix')
atom = tables.Atom.from_dtype(coo.dtype)
_filters = tables.Filters(complib='blosc', complevel=5)
ds = _file.createEArray(
_file.root,
'coo_matrix',
atom,
shape=(0, coo.shape[-1]),
expectedrows=coo.shape[-1],
filters=_filters)
# ds[:] = coo => not an option
for _index, _data in enumerate(coo):
ds.append(coo[_index][np.newaxis,:])
_file.close()
Et en utilisant hd5py
:
import h5py
h5f = h5py.File(name, 'w')
h5f.create_dataset('dataset_1', data=coo)
Les deux méthodes ne cessent d'augmenter l'utilisation de la mémoire jusqu'à ce que je dois tuer le processus. Alors, y a-t-il un moyen de le faire progressivement? Si ce n'est pas possible, pouvez-vous recommander un autre moyen de persister dans cette matrice?
EDIT
Je crée cette matrice de co-occurrence comme ceci:
coo = np.zeros((N, N), dtype=np.uint32)
for doc_id, doc in enumerate(self.w.get_docs()):
for w1, w2 in combinations(doc, 2):
if w1 != w2:
coo[w1, w2] += 1
Je veux sauver coo (2d tableau de numpy) pour le récupérer à partir du disque plus tard et trouver des valeurs de cooccurrences , comme: coo [w1, w2]
Juste pour satisfaire ma propre curiosité: qu'est-ce que * chargement postérieur *? –
En plus de stocker ce que vous essayez de faire avec ce tableau? Changer les valeurs individuelles, y accéder, accéder aux tranches, maths? – hpaulj
Il existe l'option ['np.savez_compressed'] (http://stackoverflow.com/a/18232374/832621), qui est très rapide et compacte pour déplacer les données ... –