What is the memory overhead of storing data in a .NET DataTable?

后端 未结 3 1707
旧时难觅i
旧时难觅i 2020-12-05 05:21

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

3条回答
  •  误落风尘
    2020-12-05 05:25

    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...

    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 or BindingList or similar would be far more common.

    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 tables = 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();
    

    (based on)

    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; }
    }
    

提交回复
热议问题