2012-10-18 63 views
5

Tôi hiện đang sử dụng cython để đọc tệp đầu vào, chuyển chuỗi thành int và lưu trữ chúng trong mảng c (thay vì danh sách) để tiết kiệm dung lượng. Mã tôi có dạng như sau:Cập nhật mảng C trong khi đọc tệp đầu vào

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

Tuy nhiên, chương trình luôn bị hủy khi tôi tham chiếu mảng p. Bằng cách nào đó mảng không được "định nghĩa" vì việc sử dụng bộ nhớ rất thấp. Nó hoạt động, tuy nhiên, nếu tôi đang làm

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

giá trị của i khi chương trình hủy bỏ là gì? – user1245262

+11

Bạn có thể sử dụng 'array.array()' nếu bạn chỉ lo lắng về không gian –

+1

Bằng cách này, bạn có thể sử dụng liệt kê thay vì khai báo 'i' trước và thực hiện tăng" bằng tay ". Dù sao, có thể là vấn đề là bạn gán một non-cdef dài cho mảng? Nếu bạn làm điều này: 'temp = map (int, lines.rstrip(). Split()) [0]; p [i] = temp' và bạn cdef temp cũng? – Bakuriu

Trả lời

1

đoán của tôi:

  • mã bạn được đăng là thực sự được bọc trong một chức năng, trong đó trường hợp p được cấp phát trên stack và càng sớm càng chức năng đã cho trả về, quyền truy cập vào p là bất hợp pháp.
  • bạn không kiểm tra i để bị tràn, điều gì sẽ xảy ra nếu i > 1000000?
  • cố gắng để phân bổ 1M 8-byte số nguyên trên stack có thể xa hơn những gì được cho phép, kiểm tra ulimit -a

Nhìn chung không có đủ thông tin trong OP, ví dụ:

  • là mã hàng đầu cấp trong mô-đun hoặc nội dung của một hàm?
  • chương trình bị hủy bỏ như thế nào (SEGV?)
  • đề cập đến p trong ngữ cảnh nào?
  • bạn sử dụng os/arch nào?

tôi không thể tái tạo vấn đề của bạn với Python 2.7.3 Cython 0.17.2 gcc 4.7.2 linux 3.6.9 x86-64

Các vấn đề liên quan