2010-10-04 37 views
7

Tôi có một quy trình Python chạy dài đang tạo nhiều dữ liệu hơn tôi dự định. Kết quả của tôi được lưu trữ trong một danh sách sẽ được sắp xếp theo thứ tự (được chọn) và được ghi vào đĩa khi chương trình hoàn thành - nếu nó đạt đến mức đó. Nhưng ở tốc độ này, có nhiều khả năng danh sách sẽ cạn kiệt tất cả RAM 1 GB trở lên và quá trình này sẽ bị lỗi, mất tất cả kết quả của tôi trong quá trình.Cách truy cập cấu trúc dữ liệu từ quy trình Python hiện đang chạy trên Linux?

Tôi định sửa đổi kịch bản của mình để ghi kết quả vào đĩa theo định kỳ, nhưng tôi muốn lưu kết quả của quy trình hiện đang chạy nếu có thể. Có cách nào tôi có thể lấy một cấu trúc dữ liệu trong bộ nhớ từ một tiến trình đang chạy và ghi nó vào đĩa?

Tôi tìm thấy code.interact(), nhưng vì tôi không có móc này trong mã của tôi, nó không có vẻ hữu ích đối với tôi (Method to peek at a Python program running right now).

Tôi đang chạy Python 2.5 trên Fedora 8. Mọi suy nghĩ?

Thanks a lot.

Shahin

+0

Bạn hy vọng sẽ làm gì với 'cấu trúc dữ liệu của quy trình hiện tại'? Nếu bạn lưu nó ra và tải nó trở lại trong, bạn sẽ không được chỉ là ra khỏi bộ nhớ như bạn đang bắt đầu với? –

+1

Trong trường hợp cụ thể này, tôi sẽ chuyển nó sang một máy khác (với nhiều bộ nhớ hơn) để deserialize nó và viết nó ra từng phần hoặc tải nó trực tiếp vào cơ sở dữ liệu. Rõ ràng là không bền vững, nhưng tôi chỉ đang tìm giải pháp stopgap một lần ở đây. – Shahin

Trả lời

3

Bạn không thể làm gì cho chương trình đang chạy. Điều duy nhất tôi có thể nghĩ đến là đính kèm trình sửa lỗi gdb, dừng quá trình và kiểm tra bộ nhớ. Ngoài ra, hãy đảm bảo rằng hệ thống của bạn được thiết lập để lưu các bãi lõi rồi hủy quá trình với kill --sigsegv <pid>. Sau đó, bạn có thể mở vùng kết xuất lõi bằng gdb và kiểm tra nó khi bạn rảnh rỗi.

Có một số macro gdb sẽ cho phép bạn kiểm tra cấu trúc dữ liệu python và thực thi mã python từ bên trong gdb, nhưng để làm việc này bạn cần phải biên dịch python với các biểu tượng gỡ lỗi được bật và tôi nghi ngờ đó là trường hợp của bạn. Tạo một dump lõi đầu tiên sau đó biên dịch lại python với các ký hiệu sẽ không hoạt động, vì tất cả các địa chỉ sẽ thay đổi từ các giá trị trong dump.

Dưới đây là một số liên kết cho introspecting python từ gdb:

http://wiki.python.org/moin/DebuggingWithGdb

http://chrismiles.livejournal.com/20226.html

hoặc google cho 'python gdb'

N.B. để thiết lập linux để tạo coredumps sử dụng lệnh ulimit.

ulimit -a sẽ cho bạn biết giới hạn hiện tại được đặt thành.

ulimit -c unlimited sẽ cho phép các vùng lõi có kích thước bất kỳ.

+0

Quá tệ. Điều này nghe có vẻ hữu ích hơn nói chung, mặc dù, vì vậy tôi sẽ cho nó một shot. Cảm ơn đã phản ứng chi tiết. – Shahin

0

+1 Câu hỏi rất thú vị.

Tôi không biết điều này có thể hiệu quả với bạn như thế nào (đặc biệt là vì tôi không biết bạn có sử dụng lại danh sách được chọn trong chương trình không), nhưng tôi sẽ đề xuất điều này: khi bạn ghi vào đĩa, in ra khỏi danh sách để STDOUT. Khi bạn chạy tập lệnh python của mình (tôi cũng đoán từ dòng lệnh), hãy chuyển hướng đầu ra để nối thêm vào một tệp như vậy:

python myScript.py >> logFile. 

Điều này sẽ lưu trữ tất cả các danh sách trong logFile. Bằng cách này, bạn luôn có thể xem những gì trong logFile và bạn nên có các cấu trúc dữ liệu cập nhật nhất trong đó (tùy thuộc vào nơi bạn gọi in).

Hy vọng điều này sẽ giúp

1

Trong khi chắc chắn không phải là rất đẹp, bạn có thể thử truy cập dữ liệu của quá trình của bạn thông qua hệ thống tập tin proc ../proc/[pid-of-your-process]. Hệ thống tập tin proc lưu trữ rất nhiều thông tin về quá trình như các con trỏ tập tin đang mở, bản đồ bộ nhớ và những gì không. Với một chút đào bạn có thể truy cập dữ liệu bạn cần.

Tôi vẫn nghi ngờ bạn nên xem xét điều này từ bên trong python và thực hiện một số ghi nhật ký thời gian chạy & gỡ lỗi.

0

This answer có thông tin về việc đính kèm gdb vào quá trình python, với các macro sẽ đưa bạn vào phiên pdb trong quá trình đó. Tôi đã không thử nó bản thân mình nhưng nó có 20 phiếu. Có vẻ như bạn có thể kết thúc việc treo ứng dụng, nhưng dường như cũng có giá trị rủi ro trong trường hợp của bạn.

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