2011-02-02 51 views
6

tôi có các mảng sau:Xác định số lượng byte được sử dụng bởi một biến

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

Mỗi phần tử của mảng này tham chiếu mảng khác.

A[n] = new byte[256]; 

Tuy nhiên, hầu hết các phần tử tham chiếu cùng một mảng. Trong thực tế, mảng A chỉ tham chiếu hai hoặc ba mảng duy nhất.

Có cách nào dễ dàng để xác định bộ nhớ sử dụng toàn bộ bộ nhớ?

Trả lời

5

Nếu câu hỏi của bạn là để tìm ra số của mảng 1D độc đáo, bạn có thể làm:

A.Distinct().Count() 

này nên làm vì sự bình đẳng của các mảng hoạt động trên tài liệu tham khảo-bình đẳng theo mặc định.

Nhưng có lẽ bạn đang tìm kiếm:

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

Tất nhiên, "số byte được sử dụng bởi các biến" là một thuật ngữ có phần không chính xác. Cụ thể, biểu thức trên không tính đến việc lưu trữ biến số A, tham chiếu trong mảng có răng cưa, chi phí, căn chỉnh, v.v.

EDIT: Bạn có thể cần lọc null tham chiếu nếu jagged-array có thể chứa chúng.

Bạn có thể ước tính chi phí lưu trữ các tài liệu tham khảo trong lởm chởm-mảng với (unsafe ngữ cảnh):

A.Length * sizeof(IntPtr) 
+0

Cũng cần kiểm tra null: (a.Distinct() Trường hợp (aa => aa = null) .Sum (aa => aa.Length) * sizeof (byte).!) Dump();. – Rob

+0

@Rob: Cảm ơn, đã lưu ý. – Ani

+0

Cảm ơn. (Nice code, BTW.) Tôi đang viết một thuật toán tìm kiếm Boyer-Moore và xem các bảng nhiều giai đoạn để giảm lượng bộ nhớ được sử dụng cho bảng shift và các ký tự Unicode. Nó hoạt động nhưng tôi không biết tôi đang tiết kiệm bao nhiêu bộ nhớ. Vì vậy, tôi cũng quan tâm đến các byte được sử dụng bởi A ngoài các mảng được tham chiếu. Tôi đoán của nó 4 hoặc 8 byte cho mỗi mục (tùy thuộc vào nếu 32 hoặc 64-bit xây dựng). Nó không giống như C# có thể cho tôi biết điều đó. –

1

Tôi không tin có bất kỳ xây dựng trong chức năng.

Bỏ qua điều này rất nhanh, tuy nhiên chưa thử nghiệm quá mức;

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

Tôi chỉ sửa đổi phương thức getSize của Rob để sử dụng lớp trình trợ giúp bộ đệm.

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

Tôi nhận được lỗi 'Đối tượng phải là một mảng nguyên thủy.' trên các cuộc gọi đến ByteLength(). –

+0

@Jonathan Wood, innerArray là một mảng các byte và byte là một kiểu nguyên thủy. Bạn đang đi qua trong arr? hoặc bạn đang sử dụng một loại khác với byte? –

+0

Vâng, bạn nói đúng. Nó hoạt động chỉ với mảng byte [] thuần túy. Đối với một byte [256], nó trả về (ngạc nhiên) 256. –

Các vấn đề liên quan