Есть ли способ конвейерного массива массива с диска, который сохраняется таким образом
np.save('data.npy',np.zeros(shape=[500,300,3])) # RGB image
и читается строка за строкой (или столбец за столбцом) аналогично тому, как работают генераторы, но беззадержка загрузки?
Подробное описание
Моему приложению нужна задержка, близкая к нулю, но загрузка больших массивов с диска может занять некоторое время (~ 0,02-0,1с).Даже эта небольшая задержка приводит к неприятным результатам.
У меня есть решение для этого, которое удовлетворяет скорости:
dictionary = {'array1': array1, ....}
с этим я могу сразу получить доступ к массивам, но так как я использую RasPberry Pi ZeroМоя программа на Python ограничена ЦП и ОЗУ, поэтому, если у меня много массивов, я буду иметь дело с
MemoryError
Мое приложение читает ряд за строкой с частотой 50 Гц, как это
for row in array:
[operation with row]
time.sleep(0.02) # in reality, whole cycle is 0.02s ( including operation time)
Я ищу тип генератора:
def generate_rows(path):
array = np.load(path)
for row in array:
yield row
Это решает проблему с памятью, но я думаю Я потеряю почти нулевую задержку (загрузкамассив).
Поэтому мой вопрос: Есть ли способ генерировать строки, как с помощью генератора, но первые строки готовы, так сказать, «немедленно», с почти нулевой задержкой?
РЕДАКТИРОВАТЬ: Основываясь на комментариях @Lukas Koestler и @hpaulj, я попробовал memmap, но результат на удивление не очень хороший, потому что memmap вылетает в Memory раньше, чем простая загрузка полных массивов.
WINDOWS 10
Я сохранил 1000 дисковых массивов (shape = [500,30,3]) на диске и попытался их кэшировать с помощьюnp.load и np.load с чтением memmap
import numpy as np
import os
mats = os.listdir('matrixes')
cache = []
for i in range(10):
for n in mats:
cache.append(np.load('matrixes\\{}'.format(n),mmap_mode='r')) # Load with memmap
#cache.append(np.load('matrixes\\{}'.format(n))) #load without memmap
print('{} objects stored in cache '.format((i+1)*1000))
После запуска обоих вариантов (с memmap и без него) произошли эти две ошибки
Memmap после сохранения 4000 объектов memmaps:
...
File "C:\Python27\lib\site-packages\numpy\core\memmap.py", line 264, in __new__
mm = mmap.mmap(fid.fileno(), bytes, access=acc, offset=start)
WindowsError: [Error 8] Not enough memory resources are available to process this command
Простой np.load без memmap после кэширования 5000 np.arrays
....
File "C:\Python27\lib\site-packages\numpy\lib\format.py", line 661, in read_array
array = numpy.fromfile(fp, dtype=dtype, count=count)
MemoryError
Raspberry pi Zero
Как было указано@Alex Yu, я тестировал на Windows 10, переключаясь на Raspberry Pi Zero,
Я получил более 1000 numpy массивов (заняло довольно много времени), а затем я получил
1000 objects stored in cache
Killed
С Memmaps я довольно быстро получил более 1000 memmaps, но я получил разные ошибки
File "/usr/lib/python2.7/dist-packages/numpy/lib/npyio.py", line 416, in load
return format.open_memmap(file, mode=mmap_mode)
File "/usr/lib/python2.7/dist-packages/numpy/lib/format.py", line 792, in open_memmap
mode=mode, offset=offset)
File "/usr/lib/python2.7/dist-packages/numpy/core/memmap.py", line 264, in __new__
mm = mmap.mmap(fid.fileno(), bytes, access=acc, offset=start)
mmap.error: [Errno 24] Too many open files
Если я не ошибаюсь, эта ошибка возникает при открытии большого количества файлов, но не при их закрытии.