【问题标题】:How can I gradually free memory from a numpy array?如何从 numpy 数组中逐渐释放内存?
【发布时间】:2016-10-16 08:16:28
【问题描述】:

我处于不断达到内存限制的情况(我有 20G 的 RAM)。不知何故,我设法将巨大的数组放入内存并继续我的流程。现在需要将数据保存到磁盘上。我需要将其保存为leveldb 格式。

这是负责将规范化数据保存到磁盘上的代码sn-p:

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)。

为了解决这个问题,我想在写完每个batch之后,我从numpy数组(data_train)中释放相应的内存,因为leveldb似乎是以事务的方式写入数据,直到所有数据都写入,它们是没有刷到磁盘!

我的第二个想法是,以某种方式使写入成为非事务性的,并且当使用the db.Write 写入每个批次时,它实际上将内容保存到磁盘。

我不知道这些想法是否适用。

【问题讨论】:

  • batch_size 的大小是多少?如果是整个数据集,则将其减少到 100000。
  • 哇!非常感谢!这是我在写作时遇到 bad_alloc 错误的主要原因!非常感谢男人

标签: python numpy leveldb


【解决方案1】:

尝试将batch_size 缩减为比整个数据集更小的值,例如100000

从@ren 的评论转换为社区 Wiki

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2018-10-21
    • 1970-01-01
    • 1970-01-01
    • 2012-01-12
    • 1970-01-01
    • 2013-04-22
    • 2016-05-20
    相关资源
    最近更新 更多