Как я могу создать файл NNPY на месте на диске? - PullRequest
12 голосов
/ 02 декабря 2010

Можно ли создать файл .npy без предварительного выделения соответствующего массива в памяти?

Мне нужно создать и работать с большим массивом, который слишком велик для создания в памяти. Numpy поддерживает отображение памяти, но, насколько я вижу, мои варианты:

  1. Создайте файл 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])
    
  2. Создать массив в памяти, сохранить его с помощью numpy.save, после чего он может быть загружен в режиме memmapped. Это записывает метаданные с данными массива на диске, но требует, чтобы память была выделена для всего массива хотя бы один раз.

Ответы [ 2 ]

11 голосов
/ 07 января 2011

У меня был тот же вопрос, и я был разочарован, когда прочитал ответ Свена.Похоже, что 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
"""
4 голосов
/ 02 декабря 2010

Как вы убедились, NumPy в основном предназначен для обработки данных в памяти. Существуют разные библиотеки для обработки данных на диске, наиболее часто используемая сегодня, вероятно, HDF5. Я предлагаю взглянуть на h5py , превосходную оболочку Python для библиотек HDF5. Он разработан для использования вместе с NumPy, и его интерфейс легко узнать, если вы уже знаете NumPy. Чтобы получить представление о том, как она решает вашу проблему, прочитайте документацию для наборов данных .

Для полноты картины я должен упомянуть PyTables , который представляется "стандартным" способом обработки больших наборов данных в Python. Я не использовал его, потому что h5py понравился мне больше. В обеих библиотеках есть записи часто задаваемых вопросов, определяющие их область действия относительно другой.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...