在读取输入文件时更新C数组

Eri*_* YZ 5 python arrays cython

我现在使用cython读取输入文件,将字符串转换为int并将它们存储在ac数组(而不是列表)中以节省空间.我的代码看起来像这样:

cdef long p[10000000]
cdef long i
i = 0
f = open(filename, 'r')
for line in f:
    temp = map(int, line.split())
    p[i] = temp[0]
    i = i + 1
f.close()
Run Code Online (Sandbox Code Playgroud)

但是,当我引用数组p时,程序总是被中止.不知何故,数组未被"定义",因为内存使用率非常低.但是,如果我正在做的话,它可以工作

cdef i
for i in range(0, 1000):
    p[i] = i
Run Code Online (Sandbox Code Playgroud)

Dim*_*nek 1

我的猜测:

  • 您发布的代码实际上包装在一个函数中,在这种情况下,p在堆栈上分配,一旦给定的函数返回,就可以访问p就是非法的。
  • 你不检查i溢出,如果发生什么情况i > 1000000
  • 尝试在堆栈上分配 1M 8 字节整数可能超出允许范围,请检查ulimit -a

总的来说,OP中没有足够的信息,例如:

  • 该代码是模块的顶层还是函数的内容?
  • 程序如何中止(SEGV?)
  • 指的是p在什么情况下?
  • 你使用什么操作系统/架构?

我无法使用 Python 2.7.3 Cython 0.17.2 gcc 4.7.2 linux 3.6.9 x86-64 重现您的问题