2012-10-18 16 views
5

Ora sto utilizzando cython per leggere un file di input, convertire la stringa in int e memorizzarli in un array c (anziché in un elenco) per risparmiare spazio. Il codice che ho è simile al seguente:Aggiornamento di un array C durante la lettura di un file di input

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() 

Tuttavia, il programma viene sempre interrotto quando faccio riferimento all'array p. In qualche modo l'array non è "definito" in quanto l'utilizzo della memoria è molto basso. Funziona, però, se sto facendo

cdef i 
for i in range(0, 1000): 
    p[i] = i 
+1

Qual è il valore dei quando il programma si interrompe? – user1245262

+11

Potresti usare un 'array.array()' se sei solo preoccupato per lo spazio –

+1

A proposito, puoi usare enumerare invece di dichiarare 'i' prima e fare l'incremento" a mano ". In ogni caso, è possibile che il problema è che si assegna un array non cdef alla matrice? Cosa fare se si esegue questa operazione: 'temp = map (int, lines.rstrip(). Split()) [0]; p [i] = temp' e anche tu cdef temp? – Bakuriu

risposta

1

mie supposizioni:

  • il codice che avete inviato in realtà è avvolto in una funzione, nel qual caso p è allocato sullo stack e non appena la funzione data ritorna, l'accesso a p è illegale.
  • non si controlla i per overflow, cosa succede se i > 1000000?
  • cercando di allocare 1M interi di 8 byte sullo stack può essere al di là di quanto consentito, controllare ulimit -a

Nel complesso non c'è abbastanza informazioni nel PO, ad esempio:

  • è che all'inizio Codice -level nel modulo o nel contenuto di una funzione?
  • come viene interrotto il programma (SEGV?)
  • in riferimento a p in quale contesto?
  • cosa os/arch usi?

non riuscivo a riprodurre il problema con Python 2.7.3 Cython 0.17.2 gcc 4.7.2 Linux 3.6.9 x86-64

Problemi correlati