2011-08-09 64 views
29

Tôi đang tìm cách tạo ra, từ một codebase Python lớn, một bản tóm tắt về việc sử dụng đống hoặc phân bổ bộ nhớ trong quá trình chạy hàm.Trình biên tập bộ nhớ dòng lệnh bằng Python?

Tôi quen thuộc với heapy và nó đã phục vụ tốt cho tôi khi chụp "ảnh chụp nhanh" của đống tại các điểm cụ thể trong mã của tôi, nhưng tôi thấy khó tạo ra bản tóm tắt "theo thời gian" nó. Tôi cũng đã chơi với line_profiler, nhưng nó hoạt động với thời gian chạy, không phải bộ nhớ.

Dự phòng của tôi ngay bây giờ là Valgrind với massif, nhưng thiếu rất nhiều thông tin về ngữ cảnh Python mà cả Heapy và line_profiler đều cung cấp. Có một số loại kết hợp của hai sau đó cung cấp cho một cảm giác sử dụng bộ nhớ hoặc tăng trưởng heap trong khoảng thời gian thực hiện của một chương trình Python?

+0

Bạn có thể làm điều đó với http://docs.python.org/devguide/gdb.html, nếu những gì bạn quan tâm đang xảy ra trong thế giới C? – agf

+0

Phối cảnh C sẽ ổn, nếu có cách chạy gdb tự động theo các khoảng thời gian đều đặn - có phương pháp như vậy không? – Tim

+1

Một câu hỏi hay, tôi muốn biết, vì vậy tôi đã thêm tiền thưởng. – bgw

Trả lời

13

Tôi sẽ sử dụng sys.settrace khi khởi động chương trình để đăng ký chức năng theo dõi tùy chỉnh. Custom_trace_function sẽ được gọi cho mỗi dòng mã. Sau đó, bạn có thể sử dụng chức năng đó để lưu trữ thông tin được thu thập bởi heapy hoặc meliae trong một tệp để xử lý sau.

Dưới đây là một ví dụ rất đơn giản mà các bản ghi đầu ra của hpy.heap() mỗi giây vào một tập tin văn bản đơn giản:

import sys 
import time 
import atexit 
from guppy import hpy 

_last_log_time = time.time() 
_logfile = open('logfile.txt', 'w') 

def heapy_profile(frame, event, arg): 
    currtime = time.time() 
    if currtime - _last_log_time < 1: 
     return 
    _last_log_time = currtime 
    code = frame.f_code 
    filename = code.co_filename 
    lineno = code.co_firstlineno 
    idset = hpy().heap() 
    logfile.write('%s %s:%s\n%s\n\n' % (currtime, filename, lineno, idset)) 
    logfile.flush() 

atexit.register(_logfile.close) 
sys.settrace(heapy_profile) 
+1

Tôi chưa thử * nhưng có vẻ như chúng tôi chỉ có thể thắng. (Tôi sẽ đợi đến khi kết thúc giai đoạn tiền thưởng để giải thưởng các điểm, trong trường hợp người khác muốn thử câu hỏi này) – bgw

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