如何逐渐从 numpy 数组中释放内存?
How can I gradually free memory from a numpy array?
我经常遇到内存限制(我有 20G 的 RAM)。我以某种方式设法将巨大的数组放入内存并继续我的过程。现在需要将数据保存到磁盘上。我需要将其保存为 leveldb
格式。
这是负责将标准化数据保存到磁盘的代码片段:
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)。
为了解决这个问题,我想在每批写入之后,我从numpy数组(data_train)中释放相应的内存,因为leveldb似乎是以事务方式写入数据,直到所有数据已写入,但不会刷新到磁盘!
我的第二个想法是以某种方式使写入成为非事务性的,当使用 the db.Write
写入每个批次时,它实际上将内容保存到磁盘。
我不知道这些想法是否适用。
尝试将 batch_size
缩小到小于整个数据集的值,例如 100000
.
从@ren 的评论转换为社区 Wiki
我经常遇到内存限制(我有 20G 的 RAM)。我以某种方式设法将巨大的数组放入内存并继续我的过程。现在需要将数据保存到磁盘上。我需要将其保存为 leveldb
格式。
这是负责将标准化数据保存到磁盘的代码片段:
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)。
为了解决这个问题,我想在每批写入之后,我从numpy数组(data_train)中释放相应的内存,因为leveldb似乎是以事务方式写入数据,直到所有数据已写入,但不会刷新到磁盘!
我的第二个想法是以某种方式使写入成为非事务性的,当使用 the db.Write
写入每个批次时,它实际上将内容保存到磁盘。
我不知道这些想法是否适用。
尝试将 batch_size
缩小到小于整个数据集的值,例如 100000
.
从@ren 的评论转换为社区 Wiki