【发布时间】:2011-02-02 07:40:09
【问题描述】:
我有以下数组:
byte[][] A = new byte[256][];
这个数组的每个元素都引用另一个数组。
A[n] = new byte[256];
但是,大多数元素都引用同一个数组。实际上,数组 A 只引用了两三个唯一的数组。
有没有一种简单的方法可以确定整个事物使用了多少内存?
【问题讨论】:
标签: c# .net arrays memory-management
我有以下数组:
byte[][] A = new byte[256][];
这个数组的每个元素都引用另一个数组。
A[n] = new byte[256];
但是,大多数元素都引用同一个数组。实际上,数组 A 只引用了两三个唯一的数组。
有没有一种简单的方法可以确定整个事物使用了多少内存?
【问题讨论】:
标签: c# .net arrays memory-management
如果您的问题是找出唯一一维数组的数量,您可以这样做:
A.Distinct().Count()
这应该是因为默认情况下数组的相等性适用于引用相等性。
但也许您正在寻找:
A.Distinct().Sum(oneDimArray => oneDimArray.Length) * sizeof(byte)
当然,“变量使用的字节数”是一个不太精确的术语。特别是,上面的表达式没有考虑变量A的存储、锯齿状数组中的引用、开销、对齐等。
编辑:正如 Rob 指出的,如果锯齿状数组可以包含 null 引用,您可能需要过滤掉它们。
您可以使用(unsafe 上下文)估算将引用存储在锯齿状数组中的成本:
A.Length * sizeof(IntPtr)
【讨论】:
我不相信有任何内置功能。
很快就搞定了,不过还没有彻底测试过;
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;
}
【讨论】:
我只是修改了 Rob 的 getSize 方法以使用 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;
}
【讨论】:
Object must be an array of primitives.。