Qu'est-ce que la surcharge de la mémoire de stockage des données dans un .NET DataTable?
Je suis en train d'essayer d'obtenir une poignée sur le montant de la surcharge de la mémoire associée à un .NET DataTable, et avec chacun des datarow à l'intérieur d'un tableau.
En d'autres termes, la façon de beaucoup plus de mémoire un tableau de données occuper que de ce qui serait nécessaire simplement pour stocker correctement un tableau typé de chaque colonne de données?
Je pense qu'il y aura quelques de la table de base de la surcharge, plus un certain montant par colonne, puis à nouveau d'un montant supplémentaire par ligne.
Si quelqu'un peut donner une estimation (et, je suppose, de l'explication!) de chacun de ces trois types de frais généraux?
Vous devez vous connecter pour publier un commentaire.
Bien, n'oubliez pas qu'un
DataTable
magasins 2? 3? les versions des données d'origine et mis à jour (peut-être l'un de l'autre?). Elle a aussi beaucoup de références puisqu'il est à base de cellules, et de la boxe pour tous types de valeur. Il serait difficile de quantifier exactement de la mémoire...Personnellement, j'ai très rarement utiliser
DataTable
tapé classes POCO sont beaucoup plus sensibles pari de mon point de vue. Je ne voudrais pas utiliser un tableau (directement), bien -List<T>
ouBindingList<T>
ou similaire serait beaucoup plus commun.Comme une mesure brute, vous pouvez créer un grand nombre de tables, etc et de les regarder à l'utilisation de la mémoire; par exemple, l'exemple suivant montre un ~4.3 facteur, soit plus de 4 fois plus cher, mais évidemment cela dépend beaucoup du nombre de colonnes de vs lignes vs tables etc:
vs
(à base de)
Frais généraux sont assez bas si vous ne définissez pas les index sur les colonnes. Vous pouvez obtenir une très faible empreinte mémoire si vous utilisez de la ficelle de mise en cache:
L'utilisation d'un HashSet ou Dictionnaire à utiliser seulement 1 chaîne instance de chaque chaîne de valeur. Cela semble bizarre, mais si vous extraire des données à partir d'une base de données, et vous avez plusieurs lignes avec la même chaîne de valeur (par exemple, "ALFKI"), la chaîne de valeurs sont égales, mais la chaîne instances ne sont pas: la chaîne est stockée à plusieurs reprises dans la mémoire. Si vous utilisez d'abord un HashSet pour filtrer les doublons cas, vous pouvez effectivement utiliser la même instance de chaîne 1 chaîne de valeur partout dans votre datatable. Cela peut considérablement réduire l'empreinte mémoire. Bien sûr, si les valeurs de chaîne sont déjà définis de manière statique quelque part (donc impossible de lire à partir d'une source extérieure), il n'en vaut pas la peine.
String.Intern
.Il dépend de la quantité de données et de quel type de données que vous stockez. Évidemment, le plus de données, plus de mémoire. Il y a certains frais généraux associés à la datatable qui le rend un peu plus cher. Vous devez également être conscients des Tas d'Objets Volumineux. Si vous stockez des objets de plus de 85 ko, l'objet est stocké dans la liturgie des heures. Cela peut faire des ravages sur votre garbage collection, puisqu'elle exige une collection complète. Si vous êtes pour le tester, regarder dans un profileur de mémoire pour regarder l'empreinte mémoire de la datatable.