6 votes

Détermination du nombre d'octets utilisés par une variable

J'ai le tableau suivant :

byte[][] A = new byte[256][];

Chaque élément de ce tableau fait référence à un autre tableau.

A[n] = new byte[256];

Cependant, la plupart des éléments font référence au même tableau. En fait, le tableau A ne fait référence qu'à deux ou trois tableaux uniques.

Existe-t-il un moyen simple de déterminer la quantité de mémoire utilisée par l'ensemble du système ?

5voto

Ani Points 59747

Si votre question est de trouver le nombre de tableaux 1D uniques, vous pouvez le faire :

A.Distinct().Count()

Cela devrait suffire car l'égalité des tableaux fonctionne par défaut sur l'égalité de référence.

Mais peut-être que vous cherchez :

A.Distinct().Sum(oneDimArray => oneDimArray.Length) * sizeof(byte)

Bien entendu, le "nombre d'octets utilisés par les variables" est un terme quelque peu imprécis. En particulier, l'expression ci-dessus ne tient pas compte du stockage de la variable A les références dans le réseau en dents de scie, les frais généraux, l'alignement, etc.

EDIT : Comme Rob le souligne, vous devrez peut-être filtrer null références si le jagged-array peut les contenir.

Vous pouvez estimer le coût du stockage des références dans le jagged-array avec ( unsafe contexte) :

A.Length * sizeof(IntPtr)

1voto

Rob Points 2095

Je ne crois pas qu'il y ait de fonctionnalité intégrée.

Je l'ai préparé très rapidement, mais je ne l'ai pas encore testé à fond ;

void Main()
{
    byte[][] a = new byte[256][];
    var someArr = new byte[256];
    a[0] = someArr;
    a[1] = someArr;
    a[2] = new byte[256];
    getSize(a).Dump();
}

private long getSize(byte[][] arr)
{
    var hashSet = new HashSet<byte[]>();
    var size = 0;
    foreach(var innerArray in arr)
    {
        if(innerArray != null)
            hashSet.Add(innerArray);
    }

    foreach (var array in hashSet)
    {
        size += array.Length * sizeof(byte);
    }
    return size;
}

1voto

Brian Reichle Points 657

J'ai juste modifié la méthode getSize de Rob pour utiliser la classe d'aide Buffer.

private long getSize(byte[][] arr)
{
    Dictionary<byte[], bool> lookup = new Dictionary<byte[], bool>();

    long size = 0;

    foreach (byte[] innerArray in arr)
    {
        if (innerArray == null || lookup.ContainsKey(innerArray)) continue;
        lookup.Add(innerArray, true);
        size += Buffer.ByteLength(innerArray);
    }

    return size;
}

Prograide.com

Prograide est une communauté de développeurs qui cherche à élargir la connaissance de la programmation au-delà de l'anglais.
Pour cela nous avons les plus grands doutes résolus en français et vous pouvez aussi poser vos propres questions ou résoudre celles des autres.

Powered by:

X