Je suis dans une situation où je suis constamment à la limite de ma mémoire (j'ai 20G de RAM). D'une façon ou d'une autre, j'ai réussi à mettre en mémoire l'immense tableau et à poursuivre mes processus. Maintenant, les données doivent être sauvegardées sur le disque. Je dois l'enregistrer au format leveldb
.Comment libérer progressivement de la mémoire d'un tableau numérique?
C'est l'extrait de code responsable de l'enregistrement des données normalisées sur le disque:
print 'Outputting training data'
leveldb_file = dir_des + 'svhn_train_leveldb_normalized'
batch_size = size_train
# create the leveldb file
db = leveldb.LevelDB(leveldb_file)
batch = leveldb.WriteBatch()
datum = caffe_pb2.Datum()
for i in range(size_train):
if i % 1000 == 0:
print i
# save in datum
datum = caffe.io.array_to_datum(data_train[i], label_train[i])
keystr = '{:0>5d}'.format(i)
batch.Put(keystr, datum.SerializeToString())
# write batch
if(i + 1) % batch_size == 0:
db.Write(batch, sync=True)
batch = leveldb.WriteBatch()
print (i + 1)
# write last batch
if (i+1) % batch_size != 0:
db.Write(batch, sync=True)
print 'last batch'
print (i + 1)
Maintenant, mon problème est, je frappe à peu près ma limite à la fin (495k sur 604k articles qui ont besoin être enregistré sur le disque) lors de l'enregistrement sur le disque. Pour contourner ce problème, je pensais qu'après avoir écrit chaque lot, je libère la mémoire correspondante du tableau numpy (data_train) car il semble que leveldb écrit les données d'une manière transactionnelle, et jusqu'à ce que toutes les données soient écrites, elles ne sont pas vidés sur le disque!
Ma deuxième pensée est de rendre l'écriture non-transactionnelle, et quand chaque lot est écrit en utilisant the db.Write
, il enregistre réellement le contenu sur le disque.
Je ne sais pas si l'une de ces idées est applicable.
Quelle est la taille de batch_size? Si c'est un ensemble de données entier, réduisez-le à 100000. – ren
wow! Merci beaucoup! c'était le principal coupable de moi qui frappait l'erreur bad_alloc au moment de l'écriture! Merci beaucoup homme – Breeze