2012-03-01 16 views
0

私の結果にnumpyの配列を割り当てるcdefでは、次のエラーが発生します。Cython MemoryError

---> 56  cdef np.ndarray[DTYPE_t, ndim=2] alignpmf = np.zeros([bin_len, out_len*bin_len],dtype=float) 
MemoryError: 

関連するコードは次のとおりです。

from __future__ import division 
import numpy as np 
cimport numpy as np 
cimport cython 
DTYPE = np.int 
DTYPE_f = np.float 
ctypedef np.float_t DTYPE_t 
ctypedef np.int_t DTYPE_i 

... 

@cython.boundscheck(False) 
@cython.wraparound(False) 
def full_pmfs(np.ndarray[DTYPE_i, ndim=2] align, np.ndarray[DTYPE_i, ndim=1] bins): 

    assert align.dtype == DTYPE 
    assert bins.dtype == DTYPE 
    cdef int loop_ind_i, loop_ind_j, inner_count, inner_count_start, inner_count_stop 
    cdef int bin_len = bins.shape[0] 
    cdef int i_start_ind, i_stop_ind 
    cdef int seqs = align.shape[0] 
    cdef int residues = align.shape[1] 
    cdef int size = residues * bin_len 
    cdef int out_len = residues**2 - residues // 2) 
    cdef np.ndarray[DTYPE_t, ndim=2] alignpmf = np.zeros([bin_len, 
    out_len*bin_len],dtype=float) 
    ... 

エラーの原因を上の任意の手がかり?私はPythonで同じコードを書く場合私はメモリエラーを取得しません。私が純粋なnumpyまたはcythonコードを実行すると、私のRAM(このボックスの12GB)はほとんど消費されません。参考までに、bin_lenは約20で、out_lenは80,000かもしれません。あなたのコードの末尾を削除した後に「)」(あなたは残基を計算// - 私は、エラーを再構築することができませんでした

from distutils.core import setup 
from distutils.extension import Extension 
from Cython.Distutils import build_ext 
import numpy 

ext_modules = [Extension("mi", ["mi.pyx"])] 

setup(
    name = 'MI calcs', 
    cmdclass = {'build_ext': build_ext}, 
    ext_modules = ext_modules, 
    include_dirs = [numpy.get_include(),], 
    ) 
+0

bin_lenとout_lenはあなたが思っている値ですか?前にprintステートメントを挿入することはできますか? – tillsten

答えて

1

PYXが--inplaceにbuild_extのpython setup.pyでコンパイルされています2)を呼び出し、次のように呼び出します。

from numpy import * 
import mi 
if __name__ == '__main__': 
    a = ones((20,300),mi.DTYPE) 
    b = ones(20,mi.DTYPE) 
    mi.full_pmfs(a,b) # gives you bin_len = 20 and out_len = 89850 

これは問題なく機能します。

どのように関数を正確に呼び出すのですか?また、時にはcythonのエラーメッセージが私の経験で少し間違っている可能性があります、多分それは後のステートメントですか?