私はいつも自分の記憶限界に遭っている(私は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
を使用して書き込まれると、実際にはその内容をディスクに保存します。
これらのアイデアが該当するかどうかわかりません。
BATCH_SIZEのサイズは何ですか?データセット全体の場合は、100000と言うように減らしてください。 – ren
うわー!どうもありがとう!私の主な犯人は、書き込み時にbad_allocエラーを打つ! ありがとうalot man – Breeze