Я вызываю функцию Python на C#. Он успешно загружает модель глубокого обучения в рамках C#. Тем не менее, я хочу освободить память, когда задача выполнена (например, обнаружение/вывод), но я столкнулся с проблемой. Я не могу освободить память, так как хочу выполнить несколько других задач, не закрывая приложение. В настоящее время я использую для этого PythonNet. Итак, когда я нажимаю кнопку Button3, я хочу освободить память, но объекты удерживают память размером 11 ГБ, не освобождая ее. Мне нужно предложение. Я загрузил здесь код.
Я вызываю функцию Python на C#. Он успешно загружает модель глубокого обучения в рамках C#. Тем не менее, я хочу освободить память, когда задача выполнена (например, обнаружение/вывод), но я столкнулся с проблемой. Я не могу освободить память, так как хочу выполнить несколько других задач, не закрывая приложение. В настоящее время я использую для этого PythonNet. Итак, когда я нажимаю кнопку Button3, я хочу освободить память, но объекты удерживают память размером 11 ГБ, не освобождая ее. Мне нужно предложение. Я загрузил здесь код. [code]using System; using System.Collections.Generic; using System.Diagnostics; using System.IO; using System.Windows.Forms; using Python.Runtime; using VOModel;`
public class Detection : IDisposable { private PyObject model_object; private string model_path = string.Empty; private List model_objs = new List(); private bool _disposed = false; private bool pythonEngineInitialized = false;
public void SetEnvironment(string conda_path) { if (string.IsNullOrEmpty(conda_path)) { throw new ArgumentNullException(nameof(conda_path)); }
public PyObject LoadNet_OD(string vomodel_path, string weights_path) { using (Py.GIL()) { model_path = vomodel_path; Directory.SetCurrentDirectory(vomodel_path); PyObject pyObject = Py.Import("sys"); pyObject.GetAttr("path").InvokeMethod("append", new PyString(vomodel_path)); dynamic val = Py.Import("loadnet_od"); dynamic val2 = val.load_net(weights_path); model_object = val2; model_objs.Add(model_object); // Ensure the model object is tracked for disposal Console.WriteLine("Load Done"); return val2; } }
public dynamic ExecutePythonCode(string code) { using (Py.GIL()) { using (PyScope scope = Py.CreateScope()) { scope.Exec(code); return null; // Modify as needed to return the result } } }
public dynamic GetModelObject() { if (model_object == null) { throw new InvalidOperationException("Model is not loaded."); }
return model_object; }
protected virtual void Dispose(bool disposing) { if (!_disposed) { if (disposing) { foreach (var obj in model_objs) { obj.Dispose(); } model_objs.Clear();
private void ReleaseMemory() { // Dispose of model_obj_OD if initialized if (model_obj_OD != null) { model_obj_OD.Dispose(); model_obj_OD = null; }
// Dispose of the Detection object if (od_model != null) { od_model.Dispose(); od_model = null; }
// If the Python engine was initialized, shut it down if (pythonEngineInitialized) { try { PythonEngine.Shutdown(); } catch (Exception ex) { Console.WriteLine($"An error occurred while shutting down the Python engine: {ex.Message}"); } finally { pythonEngineInitialized = false; } }
// Perform garbage collection to release any remaining resources GC.Collect(); GC.WaitForPendingFinalizers(); } } } [/code] 'Вот изображение'