2010-03-06 20 views
10

Tôi có một đoạn mã trên web lấy dữ liệu mới một lần mỗi phút, nhưng trong một vài ngày, tập lệnh kết thúc bằng 200MB bộ nhớ trở lên và tôi phát hiện ra đó là do cơ chế hóa lịch sử trình duyệt vô hạn cho hàm .back() để sử dụng.Làm cách nào để tắt lịch sử trong mô-đun cơ giới hóa python?

Tôi đã xem xét các tài liệu và tôi đã tìm thấy hàm clear_history() của lớp trình duyệt và tôi gọi mỗi lần tôi làm mới, nhưng tôi vẫn nhận được mức sử dụng bộ nhớ cao hơn 2-3MB trên mỗi lần làm mới trang. chỉnh sửa: Hmm, có vẻ như nó tiếp tục làm điều tương tự sau khi tôi gọi clear_history, cho đến khi tôi nhận được khoảng 30MB giá trị sử dụng bộ nhớ, sau đó xóa xuống 10mb hoặc lâu hơn (đó là lượng bộ nhớ cơ bản của tôi chương trình bắt đầu với) ... bất kỳ cách nào để buộc hành vi này một cách thường xuyên hơn?

Làm cách nào để duy trì cơ chế lưu trữ tất cả thông tin này? Tôi không cần phải giữ nó. Tôi muốn giữ kịch bản python của tôi dưới 15MB sử dụng bộ nhớ.

+0

câu hỏi hay - Tôi đã sử dụng cơ giới hóa trong trình thu thập luồng và lịch sử đã khiến chương trình đạt 1,5 GB bộ nhớ ... –

Trả lời

19

Bạn có thể chuyển đối số history=whatever khi bạn khởi tạo Browser; giá trị mặc định là None có nghĩa là trình duyệt thực sự khởi tạo lớp History (để cho phép backreload). Phương pháp đơn giản nhất (sẽ đưa ra một ngoại lệ lỗi thuộc tính nếu bạn đã từng làm gọi lại hoặc nạp lại):

class NoHistory(object): 
    def add(self, *a, **k): pass 
    def clear(self): pass 

b = mechanize.Browser(history=NoHistory()) 

một cách tiếp cận sạch sẽ thực hiện các phương pháp khác trong NoHistory để cung cấp cho trường hợp ngoại lệ rõ ràng hơn về việc sử dụng sai lầm của của trình duyệt back hoặc reload, nhưng cái đơn giản này là đủ. Lưu ý rằng đây là một sử dụng thanh lịch (mặc dù không được ghi chép ;-) của mẫu thiết kế tiêm phụ thuộc: trong thế giới "monkeypatching" (bleah), mã máy khách sẽ được ghi đè lên b._history sau khi trình duyệt được khởi tạo. , nhưng với tiêm phụ thuộc bạn chỉ cần vượt qua trong "lịch sử" đối tượng bạn muốn để sử dụng. Tôi đã thường xuyên duy trì rằng Dependency Injection có thể là DP quan trọng nhất không nằm trong cuốn sách "gang of 4"! -).

+0

Điều này thực sự là một phần của mã cơ chế mặc định imho. Cảm ơn một tấn;) Tôi đã sử dụng clear_history, nhập module gc và buộc thu gom rác để giữ bộ nhớ nảy ra từ 10 đến 18mb dung lượng bộ nhớ, hy vọng phương pháp của bạn sẽ cho phép mọi thứ ổn định hơn;) – ThantiK

+4

I chắc chắn các nhà bảo trì cơ giới sẽ chào đón một bản vá nhỏ thêm 'NoHistory' (trong một phiên bản có nhiều thịt hơn ;-) vào mô-đun' _mechanize.py' của họ. Tuy nhiên, vấn đề thực sự của cơ giới hóa là sự khan hiếm tài liệu - cho dù một lớp 5-line tầm thường là một phần của mã hay không thực sự nhỏ, so với thực tế là bạn không thể học về nó (cho dù bạn phải viết tầm thường 5 dòng chính mình hay không ;-) ngoại trừ bằng cách nghiên cứu cẩn thận các nguồn! –

+0

wow, Alex, bạn vừa chứng ngộ tôi. Tôi đã nghe thuật ngữ 'monkeypatching' trước đây, và cố gắng tìm ra nó. Điều này mang lại cho tôi một ví dụ thực tế nhưng nhìn qua mã của tôi, tôi đã tự làm nó! Lớp của tôi chuyển sang mặc định 'Không' cho cookiejar, và tự khởi tạo nó trừ khi một lớp khác được khởi tạo và chuyển vào. Cảm ơn một tấn! – ThantiK

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