2012-03-01 5 views
0

В cdef, где я выделяю массив numpy для своих результатов, я получаю следующую ошибку.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, он почти не потребляет мой баран (12gb на этом поле). Для справки, bin_len может быть около 20, а out_len может составлять 80 000.

дароносица скомпилирована с питоном setup.py build_ext --inplace:

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 являются значениями, которые вы считаете? Может быть, вставить заявление на печать раньше? – tillsten

ответ

1

Я не мог восстановить ошибку - после удаления замыкающего «)» в коде (при расчете остатков // 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 могут быть немного неуместными в моем опыте, может быть, это утверждение после?