Python Cython MemoryView--大型阵列上的Seg故障?

Python Cython MemoryView--大型阵列上的Seg故障?,python,cython,Python,Cython,看到非常小的简单整数数组的奇怪行为 %%cython import numpy as np cimport cython cimport numpy as np def hi(): DEF MAX = 10000000 cdef int a[MAX],i cdef int[:] a_mv = a 这会崩溃,但在较小视图中的视图会执行我的操作。这不是一个明显的内存问题,因为有足够的内存来容纳1000万整数。正如凯文在评论中提到的,问题不在于内存,而在于堆栈。您正在堆栈上

看到非常小的简单整数数组的奇怪行为

%%cython
import numpy as np
cimport cython
cimport numpy as np

def hi():
    DEF MAX = 10000000
    cdef int a[MAX],i
    cdef int[:] a_mv = a

这会崩溃,但在较小视图中的视图会执行我的操作。这不是一个明显的内存问题,因为有足够的内存来容纳1000万整数。

正如凯文在评论中提到的,问题不在于内存,而在于堆栈。您正在堆栈上分配一个包含1000万个元素的数组,而实际上您应该使用
malloc
et-friends在堆上分配它。即使在C中,这也会产生分段错误:

 /* bigarray.c */
int main(void) {
    int array[10000000];
    array[5000000] = 1;   /* Force linux to allocate memory.*/
    return 0;
}

$ gcc -O0 bigarray.c   #-O0 to prevent optimizations by the compiler
$ ./a.out 
Segmentation fault (core dumped)
而:

/* bigarray2.c */
#include <stdlib.h>

int main(void) {
    int *array;
    array = malloc(10000000 * sizeof(int));
    array[5000000] = 1;
    return 0;
}

$ gcc -O0 bigarray2.c
$ ./a.out 
$ echo $?
0
/*bigarray2.c*/
#包括
内部主(空){
int*数组;
数组=malloc(10000000*sizeof(int));
数组[5000000]=1;
返回0;
}
$gcc-O0 bigarray2.c
美元/年
$echo$?
0

内存充足,但堆栈空间不足。如果在堆栈上创建一个大的C数组,它将失败,这与Cython无关。非常正确。这是个愚蠢的问题^^