2016-10-16 1 views
2

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.

+0

Quelle est la taille de batch_size? Si c'est un ensemble de données entier, réduisez-le à 100000. – ren

+0

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

Répondre

0

Essayez de réduire batch_size à quelque chose de plus petit que l'ensemble de données complet, par exemple, 100000.

Converti Communauté Wiki de commentaire de @ren