Использование памяти numpy memmap – хочу выполнить один разPython

Программы на Python
Ответить
Anonymous
 Использование памяти numpy memmap – хочу выполнить один раз

Сообщение Anonymous »

Предположим, у меня на диске сохранена большая матрица. хранить все это в памяти нереально, поэтому для доступа к нему я использую memmap

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

A = np.memmap(filename, dtype='float32', mode='r', shape=(3000000,162))
теперь предположим, что я хочу перебрать эту матрицу (не обязательно в упорядоченном виде), чтобы к каждой строке можно было обращаться ровно один раз.

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

p = some_permutation_of_0_to_2999999()
Я бы хотел сделать что-то подобное:

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

start = 0
end = 3000000
num_rows_to_load_at_once = some_size_that_will_fit_in_memory()
while start < end:
indices_to_access = p[start:start+num_rows_to_load_at_once]
do_stuff_with(A[indices_to_access, :])
start = min(end, start+num_rows_to_load_at_once)
по мере того, как этот процесс продолжается, мой компьютер становится все медленнее и медленнее, а использование моей оперативной и виртуальной памяти стремительно растет.

Есть ли какой-нибудь способ заставить np.memmap использовать определенный объем памяти? (Я знаю, что мне не понадобится больше строк, чем я планирую прочитать за раз, и что кэширование мне не поможет, поскольку я обращаюсь к каждой строке ровно один раз)

Может быть, вместо этого есть какой-то другой способ перебора (например, генератора) по массиву np в произвольном порядке? Я мог бы написать это вручную, используя file.seek, но это происходит намного медленнее, чем реализация np.memmap.

do_stuff_with() не сохраняет никаких ссылок на получаемый массив, поэтому в этом аспекте нет «утечек памяти».

спасибо

Подробнее здесь: https://stackoverflow.com/questions/451 ... erate-once
Ответить

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

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

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

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

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