2013-04-13 46 views
6

Tôi đang cố gắng để dưa instance của lớp cellular automata của tôi, nhưng tôi nhận được lỗi này:python Pickler - sâu đệ quy vượt

RuntimeError: maximum recursion depth exceeded while calling a Python object 

cellular automata tôi bao gồm từ danh sách các tế bào (và bó của những thứ khác) nơi mỗi ô có con trỏ tới hàng xóm của nó. Trong CA cụ thể này, có 256 ô. Bây giờ, tôi biết rằng người hái phải có thể nhận ra những vật thể đã được ngâm.

From docs:
*The pickle module keeps track of the objects it has already serialized, so that later references to the same object won’t be serialized again.

Vì vậy, tôi thực sự không biết, tại sao tôi vượt quá độ sâu đệ quy tối đa.

Tôi nghĩ rằng có thể người hái làm mồi ngâm đầu tiên, để nó làm theo con trỏ đầu tiên, vượt quá ngăn xếp đệ quy và sau đó tăng ngoại lệ. Tôi biết tôi có thể mở rộng chiều sâu đệ quy tối đa với sys.setrecursionlimit(), nhưng tôi không xem xét giải pháp tốt và không thể mở rộng đó.

Câu hỏi đầu tiên: Có dưa chua có độ sâu đầu tiên không?
Câu hỏi thứ hai: Bất kỳ ý tưởng nào về cách ngăn chặn ngoại lệ này?

+0

bất kỳ mã nào bạn có thể đăng? –

+0

Có, 'pickle' đi sâu đầu tiên. Thật không may tôi không nghĩ rằng có một xung quanh này. Hãy thử 'cPickle' nhưng nó có thể sẽ cho cùng một lỗi. –

+0

@AswinMurugesh thực sự tôi có quá nhiều mã để đăng. Tuy nhiên, dưới đây là một số tệp quan trọng nếu bạn quan tâm: [vùng lân cận] (https://github.com/mirobeka/cellular-automata/blob/master/cellular_automata/lattices/neighbourhoods.py) [ô] (https://github.com/mirobeka/cellular-automata/blob/master/cellular_automata/cells/regular.py#L21) [tẩy] (https://github.com/mirobeka/cellular-automata/blob/master/cellular_automata/ lattices/equiangular.py # L210) Exp: cPickle là như nhau, tôi đã thử nó trước đây. Tôi sợ câu trả lời này –

Trả lời

6

Vì vậy, như @ExP cho biết, người làm dưa chua thực hiện việc tẩy màu đầu tiên làm cho đệ quy vượt quá ngoại lệ. Dù sao, tôi tìm thấy giải pháp cho vấn đề này ở đây bugs.python.org. Điều đó có nghĩa là cho python 3.1 pickler hoạt động ngay cả trên dữ liệu đệ quy chẳng hạn như đồ thị chẳng hạn.

Ngoài ra còn có ít giải pháp thanh lịch hơn, mất nhiều thời gian hơn để chọn một số dữ liệu đệ quy, nhưng nó đơn giản (chỉ là một vài dòng mã). Liên kết here.

Có vẻ như đã đến lúc bắt đầu từ từ di chuyển về phía python3. Hy vọng rằng ai đó tìm thấy câu trả lời này hữu ích.

+0

Nếu bạn sử dụng bản sửa lỗi từ http://bugs.python.org/issue2480, đảm bảo bạn sử dụng tệp python nonrecursivepickler-fixed.py so với tệp khác. Ngoài ra lưu ý, giải pháp dưa này nén ít hơn nhiều so với dưa vani, vì vậy các tệp dưa của bạn sẽ lớn hơn. Cảm ơn bạn đã giải pháp! – kevin948

+2

Mặc dù phiên bản issue2480 này hoạt động, nó rất không hiệu quả đối với các cấu trúc lớn vì nó sử dụng list.pop (0) và list.extend.Trên cấu trúc dữ liệu lớn của tôi, nó đã mất 10 giờ để dưa. Một viết lại để sử dụng deques giảm mà đến 4 phút. – strubbly

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