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
Мобильная версия