2012-10-18 18 views
5

Używam teraz cythonu do odczytu pliku wejściowego, przekształcenia łańcucha znaków na int i zapisania ich w tablicy c (zamiast na liście), aby zaoszczędzić miejsce. Kod mam wyglądać tak:Aktualizowanie tablicy C podczas odczytu pliku wejściowego

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

Jednak program jest zawsze przerwany, gdy odwołuję się do tablicy p. W jakiś sposób tablica nie jest "zdefiniowana", ponieważ zużycie pamięci jest bardzo niskie. To działa, jednak jeśli robię

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

Jaka jest wartość i gdy program przerywa? – user1245262

+11

Możesz użyć 'array.array()' jeśli tylko martwisz się o przestrzeń –

+1

Przy okazji, możesz użyć wyliczenia zamiast deklarowania 'i' przed i robienia kroku" ręcznie ". Czy to możliwe, że problem polega na tym, że do tablicy przypisujesz wartość inną niż cdef? Co jeśli zrobisz to: 'temp = map (int, lines.rstrip(). Split()) [0]; p [i] = temp' and you temp cd także? – Bakuriu

Odpowiedz

1

moje domysły:

  • kod pisał faktycznie owinięte w zależności, w którym to przypadku p jest przydzielona na stosie i jak najszybciej podana funkcja zwraca, dostęp do p jest nielegalny.
  • Nie sprawdzasz, czy i jest przepełnieniem, co się stanie, jeśli i > 1000000?
  • próbuje przydzielić 1M liczb całkowitych 8-bajtowych na stosie może być poza to, co jest dozwolone, sprawdzić ulimit -a

Ogólnie nie ma wystarczająco dużo informacji w PO, np:

  • jest to, że kod top -poziom w module lub treści funkcji?
  • jak program został przerwany (SEGV?)
  • w odniesieniu do numeru p w jakim kontekście?
  • jakiego używasz os/arch?

nie mogę odtworzyć problemu z Python 2.7.3 Cython 0.17.2 gcc 4.7.2 Linux 3.6.9 x86-64

Powiązane problemy