Tôi cần một số trợ giúp tìm giải pháp cho bộ nhớ bị rò rỉ mà tôi đang gặp phải. Tôi có một ứng dụng C# (.NET v3.5) cho phép người dùng chạy các kịch bản IronPython cho mục đích thử nghiệm. Các tập lệnh có thể tải các mô-đun khác nhau từ thư viện chuẩn Python (như được bao gồm trong các tệp nhị phân IronPython). Tuy nhiên, khi tập lệnh hoàn tất, bộ nhớ được cấp cho các mô-đun đã nhập không phải là rác được thu thập. Lặp qua nhiều lần chạy của một tập lệnh (được thực hiện để kiểm tra căng thẳng) khiến hệ thống hết bộ nhớ trong thời gian sử dụng lâu dài.Nhúng IronPython Memory Leak
Đây là phiên bản đơn giản của những gì tôi đang làm.
Script lớp chức năng chính:
public void Run()
{
// set up iron python runtime engine
this.engine = Python.CreateEngine(pyOpts);
this.runtime = this.engine.Runtime;
this.scope = this.engine.CreateScope();
// compile from file
PythonCompilerOptions pco = (PythonCompilerOptions)this.engine.GetCompilerOptions();
pco.Module &= ~ModuleOptions.Optimized;
this.script = this.engine.CreateScriptSourceFromFile(this.path).Compile(pco);
// run script
this.script.Execute(this.scope);
// shutdown runtime (run atexit functions that exist)
this.runtime.Shutdown();
}
Một ví dụ 'test.py' kịch bản mà tải các module ngẫu nhiên (thêm ~ 1500 KB bộ nhớ):
import random
print "Random number: %i" % random.randint(1,10)
Một cơ chế vòng lặp đó sẽ khiến hệ thống hết bộ nhớ:
while(1)
{
Script s = new Script("test.py");
s.Run();
s.Dispose();
}
Tôi đã thêm phần để không tối ưu hóa quá trình biên dịch dựa trên những gì tôi tìm thấy trong chủ đề this, nhưng rò rỉ bộ nhớ xảy ra theo cả hai cách. Thêm lời gọi rõ ràng vào s.Dispose() cũng không tạo ra sự khác biệt (như mong đợi). Tôi hiện đang sử dụng IronPython 2.0, nhưng tôi cũng đã cố gắng nâng cấp lên IronPython 2.6 RC2 mà không thành công.
Làm cách nào để lấy các mô-đun đã nhập trong tập lệnh IronPython được nhúng vào để thu gom rác như đối tượng .NET thông thường khi công cụ/thời gian chạy script không nằm trong phạm vi?
Vâng, điều này hoạt động tốt với IronPython 2.6 RC2. Nhưng nó không hoạt động với IronPython 2.0.1. Thật không may, 2.6 RC2 đang gặp sự cố khi nhập các biến vào không gian tên chung. Tôi sẽ thử 2.0.3 và đăng kết quả. Cảm ơn sự giúp đỡ cho đến nay :) – cgyDeveloper
2.0.3 cũng không tốt. – cgyDeveloper