2016-10-16 5 views
2

私はいつも自分の記憶限界に遭っている(私は20GのRAMを持っている)状況にいる。どういうわけか私は巨大な配列をメモリに入れて処理を続けました。今すぐデータをディスクに保存する必要があります。私はそれをleveldb形式で保存する必要があります。numpy配列から徐々にメモリを解放できますか?

これは、ディスクに正規化されたデータを保存するための責任のコードスニペットです:

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) 

、私の問題は、私は必要604kの項目のうち495k(一番最後にほとんど私の限界を打ちますディスクに保存するときに、ディスクに保存されます)。

この問題を回避するために、私は各バッチを記述した後、numdb配列(data_train)から対応するメモリを解放することを考えました。これは、leveldbがトランザクションの方法でデータを書き込むためです。ディスクにフラッシュされません!

私の考えは何とかして、トランザクションを非トランザクションにし、各バッチがthe db.Writeを使用して書き込まれると、実際にはその内容をディスクに保存します。

これらのアイデアが該当するかどうかわかりません。

+0

BATCH_SIZEのサイズは何ですか?データセット全体の場合は、100000と言うように減らしてください。 – ren

+0

うわー!どうもありがとう!私の主な犯人は、書き込み時にbad_allocエラーを打つ! ありがとうalot man – Breeze

答えて

0

batch_sizeをデータセット全体よりも小さくすることをお試しください(例:100000)。

@renのコメントからコミュニティのWikiに変換

関連する問題