Расширение 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

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