2010-12-02 10 views
12

対応する配列をメモリに割り当てずに.npyファイルを作成することはできますか?ディスク上にnumpy .npyファイルを作成するにはどうしたらいいですか?

メモリに作成するには大きすぎる配列を作成して作業する必要があります。 Numpyはメモリマッピングをサポートしていますが、私の選択肢は次のとおりです。

  1. 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. がmemmappedモードでロードすることができ、その後、numpy.saveを使用して保存し、メモリ内のアレイを作成します。これにより、ディスク上の配列データを持つメタデータが記録されますが、アレイ全体に対して少なくとも1回はメモリを割り当てる必要があります。

+0

なぜメタデータもファイルに書き込まないのはなぜですか? –

答えて

11

私は同じ質問をして、私がスヴェンの返信を読むと失望しました。あなたがファイル上に巨大な配列を持つことができず、一度に小さな断片に取り組むことができないなら、numpyがいくつかの重要な機能に欠けているように見えます。あなたのケースは、.npy形式を作成するためのオリジナルの合理的なユースケースの1つに近いようです(http://svn.scipy.org/svn/numpy/trunk/doc/neps/npy-format.txt参照)。

これで、numpy.lib.formatが実行されましたが、これは完全に役立つようです。なぜこの機能がnumpyのルートパッケージから利用できないのかわかりません。 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 
""" 
+0

私はちょうどそれを試してこれに戻ってきた。それは動作します - ありがとう。注意すべきこと:誤ったモード文字列を使用すると、静かに受け入れられ、ファイルが作成されますが、ヘッダーは正しく書き込まれません。新しいファイルを書くための唯一のモード文字列は 'w +'です。 – hamish

+0

それは気になるようです。たぶんバグレポートを提出しますか? – kiyo

+0

私は、このメソッドを使って38Gファイルを書き出し、少なくとも(いくつかの行を)読み込みました。このファイルには2GBの制限がありますが、これは動作しないと私は理解しています。この制限が当てはまるかどうか、大きなファイルを扱う際に何らかの問題が発生する可能性はありますか? – mathtick

4

NumPyは主にメモリ内のデータを扱うことを目的としています。ディスク上のデータを扱うためのライブラリはさまざまですが、現在最も一般的に使用されているものはおそらくHDF5です。私はh5py、HDF5ライブラリのための優れたPythonラッパーを見てお勧めします。 NumPyと一緒に使用するように設計されており、NumPyを既に知っていれば、そのインターフェイスは簡単に学習できます。あなたの問題にどのように取り組んでいるかを感じるには、documentation of Datasetsを読んでください。

完全性のために、私はPyTablesと言及する必要があります。これは、Pythonで大規模なデータセットを処理する「標準的な」方法のようです。 h5pyが私にもっとアピールしたので、私はそれを使わなかった。両方のライブラリには、他のライブラリとのスコープを定義するFAQエントリがあります。

+0

Aha。ありがとうございます。私は前のブラウジングでそれらを見つけましたが、精神的なブロックに苦しんでいました... – hamish

+0

確かに、あなたがすでにナンパーを知っているなら、h5pyのインターフェースは本当に簡単に学ぶことができます。それを使用することを学んだだけです!ありがとう! – mcrisc

関連する問題