Место общения программистов C#
Anonymous
Невозможно освободить память в C#
Сообщение
Anonymous » 25 июн 2024, 12:35
Я загружаю модель глубокого обучения из Python на C#. Это занимает около 10,8 ГБ ресурсов. Я хочу освободить ресурсы после завершения вывода, а также выполнить другие задачи. Однако после загрузки он не освобождает память даже после использования Dispose(); функция. Я загрузил код и скриншот ниже.
Код: Выделить всё
using System;
using System.Collections.Generic;
using System.ComponentModel;
using System.Data;
using System.Drawing;
using System.Linq;
using System.Text;
using System.Threading.Tasks;
using System.Windows.Forms;
using System.Xml.Linq;
using VOModel;
using Python.Runtime;
using System.Diagnostics;
namespace Memory_Test
{
public partial class Form1 : Form
{
Detection od_model = new Detection();
Detection_result od_res = new Detection_result();
PyObject model_obj_OD;
public Form1()
{
InitializeComponent();
}
private void button1_Click(object sender, EventArgs e)
{
//Load
string pypath = @"C:\Users\user\AppData\Local\Programs\Python\Python38";
string wpath = @"C:\Users\user\Desktop\DL\best.pt";
string vood_path = @"C:\Users\user\Desktop\DL\VOModels";
od_model.SetEnvironment(pypath);
Stopwatch stopwatch = new Stopwatch();
stopwatch.Start();
//model_objs_OD = od_model.LoadNet_OD_v2(vood_path, wpath);
model_obj_OD = od_model.LoadNet_OD(vood_path, wpath);
stopwatch.Stop();
Console.WriteLine("time : " + stopwatch.ElapsedMilliseconds + "ms");
}
private void button3_Click(object sender, EventArgs e)
{
// Dispose of the model_obj_OD if it's initialized
if (model_obj_OD != null)
{
model_obj_OD.Dispose();
model_obj_OD = null;
}
// Perform garbage collection to release any remaining resources
GC.Collect();
GC.WaitForPendingFinalizers();
GC.Collect();
GC.WaitForPendingFinalizers();
// Optional: Print memory statistics to verify memory release
long memoryUsed = GC.GetTotalMemory(true);
Console.WriteLine("Memory used after release: " + memoryUsed / 1024 + " KB");
}
}
}
'Эта функция LoadNet_OD из класса обнаружения'
Код: Выделить всё
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;
Console.WriteLine("Load Done");
return val2;
Смотрите скриншот здесь
Подробнее здесь:
https://stackoverflow.com/questions/786 ... in-c-sharp
1719308100
Anonymous
Я загружаю модель глубокого обучения из Python на C#. Это занимает около 10,8 ГБ ресурсов. Я хочу освободить ресурсы после завершения вывода, а также выполнить другие задачи. Однако после загрузки он не освобождает память даже после использования Dispose(); функция. Я загрузил код и скриншот ниже. [code]using System; using System.Collections.Generic; using System.ComponentModel; using System.Data; using System.Drawing; using System.Linq; using System.Text; using System.Threading.Tasks; using System.Windows.Forms; using System.Xml.Linq; using VOModel; using Python.Runtime; using System.Diagnostics; namespace Memory_Test { public partial class Form1 : Form { Detection od_model = new Detection(); Detection_result od_res = new Detection_result(); PyObject model_obj_OD; public Form1() { InitializeComponent(); } private void button1_Click(object sender, EventArgs e) { //Load string pypath = @"C:\Users\user\AppData\Local\Programs\Python\Python38"; string wpath = @"C:\Users\user\Desktop\DL\best.pt"; string vood_path = @"C:\Users\user\Desktop\DL\VOModels"; od_model.SetEnvironment(pypath); Stopwatch stopwatch = new Stopwatch(); stopwatch.Start(); //model_objs_OD = od_model.LoadNet_OD_v2(vood_path, wpath); model_obj_OD = od_model.LoadNet_OD(vood_path, wpath); stopwatch.Stop(); Console.WriteLine("time : " + stopwatch.ElapsedMilliseconds + "ms"); } private void button3_Click(object sender, EventArgs e) { // Dispose of the model_obj_OD if it's initialized if (model_obj_OD != null) { model_obj_OD.Dispose(); model_obj_OD = null; } // Perform garbage collection to release any remaining resources GC.Collect(); GC.WaitForPendingFinalizers(); GC.Collect(); GC.WaitForPendingFinalizers(); // Optional: Print memory statistics to verify memory release long memoryUsed = GC.GetTotalMemory(true); Console.WriteLine("Memory used after release: " + memoryUsed / 1024 + " KB"); } } } [/code] 'Эта функция LoadNet_OD из класса обнаружения' [code] 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; Console.WriteLine("Load Done"); return val2; [/code] Смотрите скриншот здесь Подробнее здесь: [url]https://stackoverflow.com/questions/78666228/cannot-release-memory-in-c-sharp[/url]