Nun, vergessen Sie nicht, dass ein DataTable
speichert 2? 3? Versionen der Daten - original und aktualisiert (möglicherweise eine andere?). Es hat auch viele Referenzen, da es zellenbasiert ist , und Boxen für alle Werttypen. Es wäre schwierig, den genauen Speicher zu quantifizieren ...
Persönlich verwende ich sehr selten DataTable
- getippte POCO-Klassen sind aus meiner Sicht eine viel vernünftigere Wette. Ich würde kein Array (direkt) verwenden, obwohl - List<T>
oder BindingList<T>
oder ähnliches viel häufiger wäre.
Als eine grobe Maßnahme könnten Sie eine Menge Tabellen usw. erstellen und die Speicherauslastung betrachten; zum Beispiel zeigt die folgenden a ~ 4.3 Faktor - also mehr als 4 mal so teuer, aber natürlich hängt, dass eine Menge von der Anzahl der Spalten vs Reihen vs Tabellen 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();
(basierend auf)
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; }
}
@Marc - Kein Schaden, um eine Ref Erwähnung AcceptChanges und Freunde können verwendet werden, um den Bestand der Versionen zu manipulieren, die gespeichert werden. @Nick: Bottom Line ist, wenn Sie Licht wollen, ist DataX nicht der Ort, um zu suchen, und Sie müssen nicht einmal messen, um dorthin zu gelangen. Warum nicht einige Tests nach Maß schreiben? –
@Ruben - Arbeiten an es; -p –
Marc DataTable Box Werte nicht, speichert es Werttypen in typisierten Arrays. –