我试图了解与.NET DataTable相关的内存开销量,以及表中的单个DataRows.
换句话说,数据表占用的内存多于存储每列数据的正确类型数组所需的内存量?
我想会有一些基本的表开销,加上每列的一些数量,然后每行再增加一个数量.
那么这些三种开销中的每一种/任何一种都可以给出估计(并且,我猜,解释!)吗?
那么,不要忘记一家DataTable
商店2?3?数据的版本 - 原始和更新(可能是另一个?).它也有很多参考,因为它是基于单元格的,并且适用于任何值类型.很难量化准确的记忆......
就个人而言,DataTable
在我看来,我很少使用- 打字的POCO课程是一个更明智的选择.我不会使用的阵列(直接地),虽然- List
或BindingList
或类似将更为普遍.
作为一个粗略的衡量标准,你可以创建很多表等,并查看内存使用情况; 例如,下面显示了一个~4.3因子 - 即超过4倍的价格,但显然这在很大程度上取决于列数与行与表等的关系:
// takes **roughly** 112Mb (taskman) Listtables = new List (); for (int j = 0; j < 5000; j++) { DataTable table = new DataTable("foo"); for (int i = 0; i < 10; i++) { table.Columns.Add("Col " + i, i % 2 == 0 ? typeof(int) : typeof(string)); } for (int i = 0; i < 100; i++) { table.Rows.Add(i, "a", i, "b", i, "c", i, "d", i, "e"); } tables.Add(table); } Console.WriteLine("done"); Console.ReadLine();
VS
// takes **roughly** 26Mb (taskman) List> lists = new List
>(5000); for (int j = 0; j < 5000; j++) { List
list = new List (100); for (int i = 0; i < 100; i++) { Foo foo = new Foo { Prop1 = "a", Prop3 = "b", Prop5 = "c", Prop7 = "d", Prop9 = "e"}; foo.Prop0 = foo.Prop2 = foo.Prop4 = foo.Prop6 = foo.Prop8 = i; list.Add(foo); } lists.Add(list); } Console.WriteLine("done"); Console.ReadLine();
(基于)
class Foo { public int Prop0 { get; set; } public string Prop1 { get; set; } public int Prop2 { get; set; } public string Prop3 { get; set; } public int Prop4 { get; set; } public string Prop5 { get; set; } public int Prop6 { get; set; } public string Prop7 { get; set; } public int Prop8 { get; set; } public string Prop9 { get; set; } }
如果不在列上定义索引,则开销很低.如果使用字符串缓存,则可以获得相当低的内存占用:使用HashSet或Dictionary仅使用每个字符串值的1个字符串实例.这听起来很奇怪,但是如果从数据库中获取数据,并且您有多个具有相同字符串值的行(例如"ALFKI"),则字符串值相等,但字符串实例不相同:字符串存储多次记忆.如果您首先使用HashSet过滤掉重复的实例,则可以在数据表的任何位置有效地使用相同的字符串实例作为1个字符串值.这可以大大减少内存占用.当然,如果字符串值已经在某处静态定义(因此不能从外部源读取),则不值得付出努力.