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?
- Chuyển đổi raster để một mảng NumPy đeo mặt nạ,
- Thực hiện nhiều mảng đại số để tính toán một mực nước mới,
- Ghi kết quả vào raster đầu ra.
- 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?
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