修改 新的示例在不更改ulimit的情况下爆炸,并且c部分中的内容无关紧要。
我是一名python用户(我从edX课程学习),我一直在使用ctypes和c(但我真的不知道c)。 当我使用一些特定的参数(基本上,一个大的数组大小)运行它时,我的代码出现“Segmentation fault:11”问题,这是一个复制我的代码所做的小例子:
test1.py:
import numpy as np
from numpy.ctypeslib import ndpointer
import ctypes as cy
Lib_Path = './lib.so'
class Simulacion:
def __init__(self, ss,tm):
self.tm = tm;
self.ss = ss;
def ejecutar(self):
self.data = np.empty((int(self.ss), self.tm), dtype = float)
lib = cy.CDLL(Lib_Path)
dblc = cy.c_double; pntrc = ndpointer(dblc); intc = cy.c_long
lib.trisolve.argtypes = [intc, pntrc, intc]
lib.trisolve(self.tm, self.data, self.ss)
return self.data
ss = 10
tm = int(1e6);
sim = Simulacion(ss,tm)
data = sim.ejecutar()
test1.c
void trisolve(int tm, double* data, int ss){
}
生成文件
SRC=test1
GCC=gcc-6
all:
$(GCC) -fPIC -fopenmp -lm -c -O3 $(SRC).c
$(GCC) -shared -lgomp -o lib.so $(SRC).o
clean:
rm lib.so
rm $(SRC).o
此代码在不更改ulimit的情况下爆炸。
对于我的真实代码,我使用的是“ulimit -s 65532”,这是我的mac中的最大堆栈大小。这限制了我正在使用的数组的大小,目前我需要复制它的大小。 对于我发现的问题,问题是数组存储在堆栈而不是堆中,所以我有这个硬限制因为SO。 所以我的问题是,如何将大数组传递给C,将其存储在堆中然后将其恢复到python?
我主要使用python,并且我在这个lenguaje中没有很好地形成代码的c部分,所以“stacks”,“heap”和可能“malloc”对我来说是新的术语。
谢谢!
答案 0 :(得分:1)
最后我发现了这个与ctypes无关的问题。
在我真正的c代码中,我使用array[tm]
定义了一个数组,但是tm
对于堆栈来说很大。
为什么我能用上面的代码复制问题?我真的不知道,但是当我今天尝试时(因为@eryksun告诉他代码对他有用),它并没有爆炸。
谢谢您的帮助;我将来会尝试学习更多的C语言。