在.NET DataTable中存储数据的内存开销是多少? [英] What is the memory overhead of storing data in a .NET DataTable?

查看:133
本文介绍了在.NET DataTable中存储数据的内存开销是多少?的处理方法,对大家解决问题具有一定的参考价值,需要的朋友们下面随着小编来一起学习吧!

问题描述

我正在尝试处理与.NET DataTable相关联的内存开销以及表中的单个DataRows。

换句话说,数据的内存多少表占用比仅需要存储每列数据的正确类型数组的需要?

我想会有一些基本的表开销,加上每列的一些数量,然后再次增加一个数量行。

I'm trying to get a handle on the amount of memory overhead associated with a .NET DataTable, and with individual DataRows within a table.
In other words, how much more memory does a data table occupy than what would be needed simply to store a properly typed array of each column of data?
I guess there will be some basic table overhead, plus some amount per column, and then again an additional amount per row.

任何人都可以给出每种/任何这三种开销的估计(和我猜,解释!)

So can anyone give an estimate (and, I guess, explanation!) of each/any of these three kinds of overhead?

推荐答案

嗯,别忘了,一个 DataTable 存储2? 3?数据版本 - 原始和更新(可能还有一个?)。它也有很多参考,因为它是基于单元格的,以及任何值类型的拳击。这很难量化确切的记忆...

Well, don't forget that a DataTable stores 2? 3? versions of the data - original and updated (possibly one other?). It also has a lot of references since it is cell-based, and boxing for any value-types. It would be hard to quantify the exact memory...

个人而言,我很少使用 DataTable - 键入的POCO在我看来,课堂是一个更明智的赌注。我不会使用数组(直接),但是 - 列表< T> BindingList< T> 将是更常见的。

Personally, I very rarely use DataTable - typed POCO classes are a much more sensible bet in my view. I wouldn't use an array (directly), though - List<T> or BindingList<T> or similar would be far more common.

作为粗略的措施,您可以创建大量表等,并查看内存使用情况;例如,下面显示的是一个〜4.3的因子 - 即价格是4倍以上,但很显然,这取决于列数与行数与表之间的关系。

As a crude measure, you could create a lot of tables etc and look at the memory usage; for example, the following shows a ~4.3 factor - i.e. more than 4 times as expensive, but obviously that depends a lot on the number of columns vs rows vs tables etc:

    // takes **roughly** 112Mb  (taskman)
    List<DataTable> tables = new List<DataTable>();
    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<List<Foo>> lists = new List<List<Foo>>(5000);
    for (int j = 0; j < 5000; j++)
    {
        List<Foo> list = new List<Foo>(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; }
}

这篇关于在.NET DataTable中存储数据的内存开销是多少?的文章就介绍到这了,希望我们推荐的答案对大家有所帮助,也希望大家多多支持IT屋!

查看全文
登录 关闭
扫码关注1秒登录
发送“验证码”获取 | 15天全站免登陆