Я пишу код, который должен сохранить очень большой массив numpy в памяти. Массив numpy настолько большой, что я не могу загрузить все это в память сразу. Но я могу рассчитать массив в кусках. Т.е. мой код выглядит примерно так:
for i in np.arange(numberOfChunks):
myArray[(i*chunkSize):(i*(chunkSize+1)),:,:] = #... do some calculation
Поскольку я не могу загрузить myArray
в память одновременно, я хочу сохранить его в файл по одному «чанку» за раз. т.е. я хочу сделать что-то вроде этого:
for i in np.arange(numberOfChunks):
myArrayChunk = #... do some calculation to obtain chunk
saveToFile(myArrayChunk, indicesInFile=[(i*chunkSize):(i*(chunkSize+1)),:,:], filename)
Я понимаю, что это можно сделать с помощью h5py
, но я немного запутался, как это сделать. Мое текущее понимание состоит в том, что я могу сделать это:
import h5py
# Make the file
h5py_file = h5py.File(filename, "a")
# Tell it we are going to store a dataset
myArray = h5py_file.create_dataset("myArray", myArrayDimensions, compression="gzip")
for i in np.arange(numberOfChunks):
myArrayChunk = #... do some calculation to obtain chunk
myArray[(i*chunkSize):(i*(chunkSize+1)),:,:] = myArrayChunk
Но здесь я немного растерялся. Я читал, что если вы индексируете тип данных h5py
, как я делал, когда писал myArray[(i*chunkSize):(i*(chunkSize+1)),:,:]
, то эта часть myArray
теперь считывается в память. Так что, конечно, к концу моего oop выше, у меня все еще не осталось всего myArray
в памяти? Как это спасло мою память?
Точно так же позже я хотел бы читать в моем файле по одному фрагменту за раз, делая дальнейшие вычисления. то есть я хотел бы сделать что-то вроде:
import h5py
# Read in the file
h5py_file = h5py.File(filename, "a")
# Read in myArray
myArray = h5py_file['myArray']
for i in np.arange(numberOfChunks):
# Read in chunk
myArrayChunk = myArray[(i*chunkSize):(i*(chunkSize+1)),:,:]
# ... Do some calculation on myArrayChunk
Но к концу этого l oop все ли myArray
теперь в памяти? Меня немного смущает, когда myArray[(i*chunkSize):(i*(chunkSize+1)),:,:]
находится в памяти, а когда нет. Пожалуйста, кто-нибудь может объяснить это.