2012-02-16 39 views
5

Tôi đã cố gắng để cạo một số thông tin từ một trang web theo trang, về cơ bản đây là những gì tôi đã làm:"Out of Memory" lỗi với mechanize

import mechanize 
MechBrowser = mechanize.Browser() 

Counter = 0 

while Counter < 5000: 
    Response = MechBrowser.open("http://example.com/page" + str(Counter)) 
    Html = Response.read() 
    Response.close() 

    OutputFile = open("Output.txt", "a") 
    OutputFile.write(Html) 
    OutputFile.close() 

    Counter = Counter + 1 

Vâng, các mã trên đã kết thúc ném ra "Out of Bộ nhớ "lỗi và trong công việc quản lý nó cho thấy rằng kịch bản sử dụng lên gần 1GB bộ nhớ sau vài giờ chạy ... làm thế nào đến ?!

Có ai cho tôi biết điều gì đã xảy ra không?

+2

Điều đầu tiên tôi muốn loại trừ là cơ giới hóa bị rò rỉ bộ nhớ - chỉ cần sử dụng 'urllib2.urlopen()' để thay thế. –

+3

Cũng giống như một lưu ý, nó nhiều hơn nữa pythonic để làm '' cho truy cập trong phạm vi (5000): ''. Và PEP8 khuyến nghị lower_case_with_underscores cho các tên biến, trong khi CamelCase được dành riêng cho các lớp. Ngoài ra, hãy kiểm tra '' with'' để viết/đọc/từ tệp. –

+2

(a) Loại câu hỏi "có gì với mã của tôi" tốt hơn trên codereview (b) sử dụng lại biến vì vậy không phải là vấn đề (c) Tìm hiểu về cách định cấu hình bộ nhớ. – Marcin

Trả lời

13

Đây không phải là chính xác rò rỉ bộ nhớ, mà là một tính năng không có giấy tờ. Về cơ bản, mechanize.Browser() đang lưu trữ chung tất cả lịch sử trình duyệt trong bộ nhớ khi nó đi.

Nếu bạn thêm một cuộc gọi đến MechBrowser.clear_history() sau Response.close(), nó sẽ giải quyết được sự cố.

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