Какова память наверху того, чтобы хранить данные в.NET DataTable?

USE CSS opacity: 1.0 с <div>, расположенным над вашим контентом ...

Вы можете вывести pdf, используя <object> или <iframe>, затем поместить абсолютную позицию и использовать z -index, чтобы покрыть ваш pdf-файл. Используйте css opacity: 1.0.

Теперь, когда пользователи пытаются щелкнуть или скопировать, они ничего не получают, потому что они действительно нажимают на пустой <div> !!!!

Его взломать, но он работает! Пользователь сможет читать контент, он может сделать снимок экрана, но они не смогут копировать текст и вставлять его где угодно.

23
задан Nick 8 January 2009 в 15:18
поделиться

3 ответа

Ну, не забывайте, что DataTable хранит 2? 3? версии данных - оригинальные и обновленные (возможно, еще одна?). Он также имеет много ссылок, так как он основан на ячейках и помещается в бокс для любых типов значений . Было бы трудно определить точное количество памяти ...

Лично я очень редко использую DataTable - типизированные классы POCO, на мой взгляд, гораздо более разумная ставка. Я бы не использовал массив (напрямую), хотя - List<T> или BindingList<T> или подобное было бы гораздо более распространенным.

В качестве грубой меры вы можете создать множество таблиц и т. Д. И посмотреть на использование памяти; Например, ниже показан коэффициент ~ 4,3, т.е. более чем в 4 раза дороже, но, очевидно, это во многом зависит от количества столбцов, строк, таблиц и т. д .:

    // 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();

против

    // 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; }
}
22
ответ дан Marc Gravell 29 November 2019 в 02:25
поделиться

Наверху является довольно низким, если Вы не определяете индексы на столбцах. Можно получить довольно низкий объем потребляемой памяти при использовании строкового кэширования: Используйте HashSet или Словарь для использования всего 1 строкового экземпляра каждого строкового значения. Это звучит странным, но если Вы выбираете данные из базы данных, и у Вас есть несколько строк с тем же строковым значением (например, "ALFKI"), строковые значения равны, но строковые экземпляры не: строка хранится многократно в памяти. При первом использовании HashSet для того, чтобы отфильтровать дублирующиеся экземпляры Вы эффективно используете тот же строковый экземпляр для 1 строкового значения везде в Вашей таблице данных. Это может значительно уменьшить объем потребляемой памяти. Конечно, если строковые значения уже статически определяются где-нибудь (так не чтение из внешнего источника), это не стоит усилия.

8
ответ дан Frans Bouma 29 November 2019 в 02:25
поделиться

Это зависит от того, сколько данных и какие данные вы храните. Очевидно, что чем больше данных, тем больше памяти. С данными связаны некоторые накладные расходы, что делает его немного дороже. Вы также должны знать о куче больших объектов. Если вы храните объекты размером более 85 КБ, объект будет сохранен в LOH. Это может нанести ущерб вашей сборке мусора, так как требует полной сборки. Если вы готовы его протестировать, загляните в профилировщик памяти, чтобы посмотреть объем памяти, доступной для данных.

4
ответ дан Papa Burgundy 29 November 2019 в 02:25
поделиться
Другие вопросы по тегам:

Похожие вопросы: