Расширение np.memmapPython

Программы на Python
Ответить
Anonymous
 Расширение np.memmap

Сообщение Anonymous »

У меня огромные объекты np.memmap, и мне нужно регулярно их расширять. Мне было интересно, является ли мой нынешний подход безопасным и наиболее эффективным, и я начал искать в Интернете. Я наткнулся на следующий вопрос stackoverflow:
stackoverflow: изменение размера массивов numpy memmap
Поскольку этому вопросу уже 12 лет, я решил открыть новый вопрос.
Подход, который я сейчас использую, указан в самом низу поста выше:
arr_shape = (1000, 256)
arr = np.memmap(f"{output_dir}/fingerprints.mm", dtype="float32", mode="w+", shape=arr_shape)
# some stuff is written to arr
arr.flush()

new_shape = (2000, 256)
arr = np.memmap(f"{output_dir}/fingerprints.mm", dtype="float32", mode="r+", shape=new_shape)
# some stuff is written to arr[arr_shape[0]:, :]
arr.flush()

Таким образом я увеличиваю размер карты памяти примерно до (1e8, 256).
Мои вопросы:
  • В разделе комментариев к этому подходу Майкл отвечает: «[...] Я бы предпочел решение на месте, [...]». Разве это не локальное решение? Я подумал, что так и будет. Копирует ли этот метод всю карту памяти в новую?
  • Если это действительно решение на месте: безопасен ли этот подход? Что произойдет, если следующие блоки памяти уже используются?
  • Если это не локальное решение: есть ли более эффективные способы сделать это?
  • Существует также метод memmap.resize (документация memmap.resize). Однако где бы я ни читал об этом, люди утверждают, что у них возникают различные проблемы с этим методом. Но все эти сообщения довольно старые, и я не уверен, что эти проблемы все еще сохраняются.
  • ChatGPT предлагает решение с усечением файла, однако я не могу найти ссылок на этот подход:
.
n_bytes = np.prod(new_shape) * np.dtype("float32").itemsize

with open(path, "r+b") as f:
f.truncate(n_bytes)

arr = np.memmap(path, dtype="float32", mode="r+", shape=new_shape)


Подробнее здесь: https://stackoverflow.com/questions/798 ... -np-memmap
Ответить

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

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

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

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

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