2010-11-04 21 views
10

Tôi có một loạt lớn các tập dữ liệu raster đại diện cho lượng mưa hàng tháng qua nhiều thập kỷ. Tôi đã viết một kịch bản trong Python mà vòng qua mỗi raster và làm như sau:Làm thế nào để lặp qua một tập dữ liệu lớn trong python mà không nhận được một MemoryError?

  1. Chuyển đổi raster để một mảng NumPy đeo mặt nạ,
  2. Thực hiện nhiều mảng đại số để tính toán một mực nước mới,
  3. Ghi kết quả vào raster đầu ra.
  4. Lặp lại

Kịch bản chỉ là một danh sách dài các phương trình đại số mảng được bao bọc bởi một tuyên bố vòng lặp.

Mọi thứ hoạt động tốt nếu tôi chỉ chạy tập lệnh trên một phần nhỏ dữ liệu của mình (nói giá trị 20 năm), nhưng nếu tôi cố gắng xử lý toàn bộ lô, tôi nhận được MemoryError. Lỗi không cung cấp thêm bất kỳ thông tin nào (trừ khi nó làm nổi bật dòng trong mã mà Python đã từ bỏ).

Thật không may, tôi không thể dễ dàng xử lý dữ liệu của mình theo khối - tôi thực sự cần có thể thực hiện toàn bộ cùng một lúc. Điều này là do, vào cuối mỗi lần lặp lại, đầu ra (mức nước) được đưa trở lại vào lần lặp tiếp theo làm điểm bắt đầu.

Sự hiểu biết về lập trình của tôi rất cơ bản, nhưng tôi nghĩ rằng tất cả các đối tượng của tôi sẽ chỉ bị ghi đè trên mỗi vòng lặp. Tôi (ngu ngốc?) Giả định rằng nếu mã được quản lý để lặp thành công một lần thì nó sẽ có thể lặp vô thời hạn mà không cần sử dụng nhiều bộ nhớ hơn.

Tôi đã thử đọc nhiều tài liệu khác nhau và đã phát hiện ra một thứ gọi là "Bộ sưu tập rác", nhưng tôi cảm thấy như tôi đang thoát ra khỏi chiều sâu và bộ não của tôi đang tan chảy! Bất cứ ai có thể cung cấp một số cái nhìn sâu sắc cơ bản vào những gì thực sự xảy ra với các đối tượng trong bộ nhớ khi vòng mã của tôi? Có cách nào để giải phóng bộ nhớ ở cuối mỗi vòng lặp hay có cách mã hóa "Pythonic" nào đó tránh được vấn đề này hoàn toàn không?

+1

Tôi không nghĩ mọi người sẽ có thể giúp bạn quá nhiều mà không thấy một số mã nguồn. – GWW

Trả lời

4

một cách nhanh chóng để "ép" các bộ thu rác để làm sạch các vòng lặp chỉ tạm thời đối tượng là del tuyên bố:

for obj in list_of_obj: 
    data = obj.getData() 
    do_stuff(data) 
    del data 

này buộc người phiên dịch để xóa và miễn phí các đối tượng tạm thời. LƯU Ý: điều này không đảm bảo chương trình không bị rò rỉ hoặc tiêu thụ bộ nhớ trong các phần khác của tính toán, chỉ cần kiểm tra nhanh

5

Bạn không cần phải quan tâm đến việc quản lý bộ nhớ, đặc biệt là không có bộ thu gom rác có một nhiệm vụ rất cụ thể mà bạn rất có thể thậm chí không sử dụng. Python sẽ luôn thu thập bộ nhớ mà nó có thể và tái sử dụng nó. Chỉ có hai lý do cho vấn đề của bạn: Dữ liệu bạn cố tải quá nhiều để vừa với bộ nhớ hoặc tính toán lưu trữ dữ liệu ở đâu đó (danh sách, dict, cái gì đó liên tục giữa các lần lặp) và bộ nhớ đó tăng lên và phát triển . Memory profilers can help tìm thấy điều đó.

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