Как я могу постепенно освобождать память от массива numpy?

#python #numpy #leveldb

#питон #тупой #leveldb

Вопрос:

Я нахожусь в ситуации, когда я постоянно превышаю лимит памяти (у меня 20 ГБ оперативной памяти). Каким-то образом мне удалось поместить огромный массив в память и продолжить мои процессы. Теперь данные необходимо сохранить на диск. Мне нужно сохранить его в 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)
 

Теперь моя проблема в том, что я достиг своего предела в самом конце (495k из 604k элементов, которые необходимо сохранить на диск) при сохранении на диск.

Чтобы обойти эту проблему, я подумал, что после записи каждого пакета я освобождаю соответствующую память из массива numpy (data_train), поскольку кажется, что leveldb записывает данные транзакционным способом, и пока все данные не будут записаны, они не сбрасываются на диск!

Моя вторая мысль состоит в том, чтобы каким-то образом сделать запись нетранзакционной, и когда каждый пакет записывается с использованием the db.Write , он фактически сохраняет содержимое на диск.

Я не знаю, применима ли какая-либо из этих идей.

Комментарии:

1. Каков размер batch_size ? Если это весь набор данных, уменьшите его, скажем, до 100000.

2. вау! Большое спасибо! это был главный виновник того, что я попал в ошибку bad_alloc во время записи! Большое спасибо, чувак

Ответ №1:

Попробуйте уменьшить batch_size размер до чего-то меньшего, чем весь набор данных, например, 100000 .

Преобразовано в сообщество Wiki из комментария @ren