2011-02-02 14 views
6

Tengo la siguiente matriz:La determinación del número de bytes utilizados por una variable

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

Cada elemento de esta matriz hace referencia a otra matriz.

A[n] = new byte[256]; 

Sin embargo, la mayoría de los elementos hacen referencia a la misma matriz. De hecho, la matriz A solo hace referencia a dos o tres matrices únicas.

¿Hay alguna manera fácil de determinar cuánta memoria usa todo?

Respuesta

5

Si su pregunta es averiguar el número de matrices 1D únicas, que podría hacer:

A.Distinct().Count() 

Esto debe hacerlo porque la igualdad de las matrices de referencia funciona en igualdad de forma predeterminada.

Pero tal vez está buscando:

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

Por supuesto, el "número de bytes utilizados por las variables" es un término algo impreciso. En particular, la expresión anterior no tiene en cuenta el almacenamiento de la variable A, referencias en la matriz dentada, sobrecarga, alineación, etc.

EDITAR: Como señala Rob, es posible que deba filtrar las referencias null si el jagged-array puede contenerlos.

se puede estimar el costo de almacenar las referencias en el dentado-matriz con (unsafe contexto):

A.Length * sizeof(IntPtr) 
+0

también necesita un cheque nulo: (a.Distinct() Donde (AA => aa = null) .sum (aa => aa.Length) * sizeof (byte).!) Dump();. – Rob

+0

@Rob: Gracias, señaló. – Ani

+0

Gracias. (Bonito código, BTW.) Estoy escribiendo un algoritmo de búsqueda de Boyer-Moore y mirando tablas de varias etapas para reducir la cantidad de memoria utilizada para la tabla de cambios y los caracteres Unicode. Está funcionando pero no sé cuánta memoria estoy guardando. También me interesan los bytes utilizados por A además de los arreglos a los que se hace referencia. Supongo que es 4 u 8 bytes por artículo (dependiendo de si la compilación es de 32 o 64 bits). No parece que C# pueda decirme eso. –

1

No creo que haya ninguna construido en la funcionalidad.

Arrancó esto rápidamente, sin embargo, no lo he probado a fondo;

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

Acabo de modificar el método getSize de Rob para usar la clase Buffer helper.

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

Aparece el error 'El objeto debe ser una matriz de primitivas' en la llamada a ByteLength(). –

+0

@Jonathan Wood, innerArray es una matriz de bytes y el byte es un tipo primitivo. ¿Estás pasando por arr? o estás usando un tipo que no sea byte? –

+0

Sí, tienes razón. Funciona solo con la matriz de byte simple []. Para un byte [256], devuelve (sorpresa) 256. –

Cuestiones relacionadas