gpt4 book ai didi

c# - 我的内存在哪里?重新初始化数据表

转载 作者:行者123 更新时间:2023-11-30 20:58:17 27 4
gpt4 key购买 nike

我有包含 1 个 DataGridView、1 个 DataTable 等的应用程序。

我的“执行”方法(已编辑):

private void btnRunSQL_click()
{
string strConnStr = tbConnStr.Text; // connection string from textbox
string strSQL = tbSql.Text; // query from textbox

SqlDataAdapter dataAdapter = new SqlDataAdapter(strSQL, strConnStr);
SqlCommandBuilder commandBuilder = new SqlCommandBuilder(dataAdapter);

// clean memory
// dtData DataTable is declared in main form class
dtData = new DataTable();
dataAdapter.Fill(dtData);

showMemoryUsage();

}

这是我检查内存的方式:

 public void showMemoryUsage()
{
Process proc = Process.GetCurrentProcess();
this.Text = "Peak memory: " + proc.PeakWorkingSet64 / 1024 / 1024 + "MB";
Application.DoEvents(); // force form refresh
}

当我多次运行这个函数时 - 它使用越来越多的内存。我正在处理非常大的数据集(1000000 行),经过几次大查询后我必须重新启动我的应用程序。

运行 1M 行查询后,我的内存使用量约为 900MB,第二次运行 1100MB、1300MB 等。

我以为重新初始化 DataTable 会释放我的内存,但事实并非如此。所以我重新初始化了 BindingSource(与 DataGridView 连接),但它也没有帮助。最后我评论了我的 BindingSource 和 DataGridView。

稍后添加:

处理 DataAdapter 没有帮助。

我删除了 DataGridView 和绑定(bind)源。没有帮助。

解决方案(我合并了几个答案并创建了没有泄漏的测试应用程序)

using System;
using System.Data;
using System.Windows.Forms;
using System.Data.SqlClient;
using System.Diagnostics;

// to run this code you need form and controls:

// TextBox tbConnStr - textbox with SQL Server connection string
// TextBox tbSQL - for SQL query to run/test
// TextBox tbLog - for log display
// Button btnRunSQL with OnClick event set to proper method
// Button btnRunTest with OnClick event set to proper method

namespace Test_datatable
{
public partial class Form1 : Form
{

DataTable dt; // i need this global

public Form1()
{
InitializeComponent();
}

private void btnRunSQL_Click(object sender, EventArgs e)
{
log("Method starts.");

string strConnStr = tbConnStr.Text;
string strSQL = tbSQL.Text;

using (SqlDataAdapter da = new SqlDataAdapter(strSQL, strConnStr))
{
using (SqlCommandBuilder cb = new SqlCommandBuilder(da))
{

if (dt != null)
{
dt.Clear();
dt.Dispose();
log("DataTable cleared and disposed.");
}

dt = new DataTable();
da.Fill(dt);
log("DataTable filled.");

}
}

log("Method ends.");
tbLog.Text += Environment.NewLine;

}

// prints time, string and memory usage on textbox
private void log(string text)
{
tbLog.Text += DateTime.Now.ToString()
+ " " + text + memory() +
Environment.NewLine;

Application.DoEvents(); // force form refresh
}

// returns memory use as string, example: "Memory: 123MB"
private string memory()
{
Process proc = Process.GetCurrentProcess();
return " Peak memory: " + (proc.PeakWorkingSet64 / 1024 / 1024).ToString() + "MB ";

}

// test method for 10 runs
private void btnRunTest_Click(object sender, EventArgs e)
{
for (int i = 0; i < 10; i++)
{
btnRunSQL_Click(new object(), new EventArgs());
}
}
}
}

最佳答案

最佳猜测:仍然存在通过绑定(bind)从 GUI 到旧数据表的链接。但是缺少实际代码。

我在这种情况下的首选方法:

if (bs != null)     bs.Clear();      // most likely solution
if (dtData != null) dtData.Clear(); // won't hurt

dtData = new DataTable();
bs = new BindingSource();

关于c# - 我的内存在哪里?重新初始化数据表,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/16238206/

27 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com