Как получить доступ ко всему массиву Zarr, не загружая весь массив в память?Python

Программы на Python
Ответить Пред. темаСлед. тема
Anonymous
 Как получить доступ ко всему массиву Zarr, не загружая весь массив в память?

Сообщение Anonymous »

Я использую zarr для хранения большого фрагментированного массива. Допустим, массив store и zarr создается следующим образом:

Код: Выделить всё

import zarr
import numpy as np

store = zarr.storage.LocalStore('mydata.zarr')
zarr_data = zarr.create_array(
store=self.store,
name='data',
shape=(40000, 100),
chunks=(1000, 100),
dtype='f4')

zarr_data[:] = np.random.randn(10000, 100)
У меня есть отдельная программа на Python, которая будет иметь доступ ко всему массиву, но не ко всему сразу; скорее, он будет получать данные пакетно.

Код: Выделить всё

store = zarr.storage.LocalStore('mydata.zarr')
root = zarr.open(store=self.store, mode='r')

for i in range(root['data'].shape[0]):
batch = root['data'][i]
< /code>
Мой вопрос: если бы я запустил этот код, будет ли весь набор данных в конечном итоге загружен в память? И если так, есть ли способ избежать этого? В моем приложении полный массив Zarr будет слишком большим, чтобы вписаться в память. Я думаю, что идеальным решением будет способ выпустить ранее читаемые куски из памяти, когда они больше не нужны. Есть ли способ сделать это? Как вы можете видеть, массив Zarr содержит 16 МБ данных, но кажется, что использование памяти процесса увеличивается только примерно на ~ 2 МБ в ходе итерации над массивом Zarr.  Вот код и визуализация использования памяти: < /p>
Code I запустил: < /p>
def current_memory():
process = psutil.Process(os.getpid())
memory_usage = process.memory_info().rss
memory_usage_mb = memory_usage / (1024 ** 2)
return memory_usage_mb

init_mem = current_memory()
mem_measurements = []

store = zarr.storage.LocalStore('./memtest.zarr')
root = zarr.open(store=store, mode='r')

print(root['data'].info)

batch_size=10
for i in range(0, root['data'].shape[0] - batch_size, batch_size):
batch = root['data'][i:i+batch_size]
mem_measurements.append(current_memory() - init_mem)
Вывод print(root['data'].info):
Type : Array
Zarr format : 3
Data type : DataType.float32
Shape : (40000, 100)
Chunk shape : (1000, 100)
Order : C
Read-only : False
Store type : LocalStore
Filters : ()
Serializer : BytesCodec(endian=)
Compressors : (ZstdCodec(level=0, checksum=False),)
No. bytes : 16000000 (15.3M)
< /code>
Измеренное использование памяти:
использование памяти по пакетам < /p>
Закрытие мыслей < /h1>
Это похоже на Зарр не загружает весь массив в память, когда итерация над ним. Следующий вопрос; почему это? Zarr кэширует что -нибудь или держит куски в памяти?


Подробнее здесь: https://stackoverflow.com/questions/793 ... nto-memory
Реклама
Ответить Пред. темаСлед. тема

Быстрый ответ

Изменение регистра текста: 
Смайлики
:) :( :oops: :roll: :wink: :muza: :clever: :sorry: :angel: :read: *x)
Ещё смайлики…
   
К этому ответу прикреплено по крайней мере одно вложение.

Если вы не хотите добавлять вложения, оставьте поля пустыми.

Максимально разрешённый размер вложения: 15 МБ.

  • Похожие темы
    Ответы
    Просмотры
    Последнее сообщение

Вернуться в «Python»