Как я могу создать файл NNPY на месте на диске?
Можно ли создать файл.npy без выделения соответствующего массива в памяти?
Мне нужно создать и работать с большим массивом, слишком большим, чтобы создать его в памяти. Numpy поддерживает отображение памяти, но, насколько я вижу, мои варианты:
Создайте файл memmapped, используя numpy.memmap. Это создает файл непосредственно на диске без выделения памяти, но не сохраняет метаданные, поэтому, когда я позже заново сопоставлю файл, мне нужно будет знать его dtype, форму и т. Д. В дальнейшем обратите внимание, что не указывается результат формы в memmap интерпретируется как плоский массив:
In [77]: x=memmap('/tmp/x', int, 'w+', shape=(3,3)) In [78]: x Out[78]: memmap([[0, 0, 0], [0, 0, 0], [0, 0, 0]]) In [79]: y=memmap('/tmp/x', int, 'r') In [80]: y Out[80]: memmap([0, 0, 0, 0, 0, 0, 0, 0, 0])
Создайте массив в памяти, сохраните его с помощью numpy.save, после чего он может быть загружен в режиме memmapped. Это записывает метаданные с данными массива на диске, но требует, чтобы память была выделена для всего массива хотя бы один раз.
2 ответа
У меня был тот же вопрос, и я был разочарован, когда прочитал ответ Свена. Похоже, что numpy будет упускать некоторые ключевые функции, если вы не можете иметь огромный массив в файле и работать над его небольшими частями одновременно. Кажется, ваш случай близок к одному из вариантов использования в оригинальной рациональной форме для создания формата.npy (см.: http://svn.scipy.org/svn/numpy/trunk/doc/neps/npy-format.txt).
Затем я натолкнулся на numpy.lib.format, который, кажется, был полезен. Я понятия не имею, почему эта функциональность недоступна в пакете numpy root. Ключевое преимущество перед HDF5 заключается в том, что он поставляется с NumPy.
>>> print numpy.lib.format.open_memmap.__doc__
"""
Open a .npy file as a memory-mapped array.
This may be used to read an existing file or create a new one.
Parameters
----------
filename : str
The name of the file on disk. This may not be a filelike object.
mode : str, optional
The mode to open the file with. In addition to the standard file modes,
'c' is also accepted to mean "copy on write". See `numpy.memmap` for
the available mode strings.
dtype : dtype, optional
The data type of the array if we are creating a new file in "write"
mode.
shape : tuple of int, optional
The shape of the array if we are creating a new file in "write"
mode.
fortran_order : bool, optional
Whether the array should be Fortran-contiguous (True) or
C-contiguous (False) if we are creating a new file in "write" mode.
version : tuple of int (major, minor)
If the mode is a "write" mode, then this is the version of the file
format used to create the file.
Returns
-------
marray : numpy.memmap
The memory-mapped array.
Raises
------
ValueError
If the data or the mode is invalid.
IOError
If the file is not found or cannot be opened correctly.
See Also
--------
numpy.memmap
"""
Как вы уже поняли, NumPy в основном предназначен для обработки данных в памяти. Существуют различные библиотеки для обработки данных на диске, наиболее часто используемая сегодня, вероятно, HDF5. Я предлагаю взглянуть на h5py, отличную оболочку Python для библиотек HDF5. Он разработан для использования вместе с NumPy, и его интерфейс легко узнать, если вы уже знаете NumPy. Чтобы получить представление о том, как она решает вашу проблему, прочитайте документацию по наборам данных.
Для полноты картины я должен упомянуть PyTables, который представляется "стандартным" способом обработки больших наборов данных в Python. Я не использовал его, потому что h5py понравился мне больше. Обе библиотеки имеют записи часто задаваемых вопросов, определяющих их область действия относительно другой.