gpt4 book ai didi

c# - List 使用比 DataTable 更多的内存?

转载 作者:太空狗 更新时间:2023-10-29 23:19:24 24 4
gpt4 key购买 nike

我一直认为 DataTable 会比一般的 List 消耗更多的内存。我正在测试从 SQL Server 查询加载数据表和加载列表。在这种情况下,DataTable 消耗的内存较少。我得到前 2000 行,每行有 134 个字段。一个二进制字段,其余为标准的 varchar、int、bit 等。

在这个世界上,一个具有所有开销的 DataTable 怎么可能比 List 消耗更少的内存? GC 报告了大约 4mb 的 DataTable 和 5mb 的列表。

我确实用一些 NorthWind 表进行了测试,在这些情况下列表略小。

private void GetMemory()
{
label1.Text = string.Format("{0:0.00} MB", GC.GetTotalMemory(true) / 1024.0 / 1024.0);
}
private void DataTableButton_Click(object sender, EventArgs e)
{
var conn = new SqlConnection(@"Initial Catalog=ADatabase;Data Source=AServer;Integrated Security=True");
conn.Open();

var cmd = new SqlCommand("SELECT TOP 2000 * FROM AManyColumnedTable", conn);

var r = cmd.ExecuteReader();
_rows = new List<object[]>();

//uses more memory
object[] a = null;
while (r.Read())
{
a = new object[r.FieldCount];
r.GetValues(a);
_rows.Add(a);
}
//uses less memory
//_table = new DataTable("TheTable");
//_table.Load(r);

r.Close();
conn.Close();
GetMemory();
}

最佳答案

这是错觉。不知何故 GC 没有给你正确的值,可能是因为有些对象还没有被收集。也许加载数据表会导致更多的中间对象,从而导致另一次垃圾收集。

您的数组列表以与数据表相同的方式存储数据,但没有数据表和每个数据行包含的额外信息的开销。

如果您希望它的内存效率更高,您应该为数据记录创建一个类,这样您就可以将值类型存储为普通值而不是装箱在对象中。例如,一个 int 在装箱时使用 20 个字节,但作为普通成员变量仅使用 4 个字节。

关于c# - List<object[]> 使用比 DataTable 更多的内存?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/1772077/

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