我有以下数组:
byte[][] A = new byte[256][];
此数组的每个元素都引用另一个数组。
A[n] = new byte[256];
但是,大多数元素引用相同的数组。实际上,数组A仅引用两个或三个唯一数组。
有没有一种简单的方法来确定整个事物使用多少内存?
答案 0 :(得分:5)
如果你的问题是找出唯一的一维数组的数量,你可以这样做:
A.Distinct().Count()
这应该这样做,因为默认情况下数组的相等性在引用相等性上起作用。
但也许你正在寻找:
A.Distinct().Sum(oneDimArray => oneDimArray.Length) * sizeof(byte)
当然,“变量使用的字节数”是一个有点不精确的术语。特别是,上面的表达式没有考虑变量A
的存储,锯齿数组中的引用,开销,对齐等。
编辑:正如Rob指出的那样,如果锯齿状数组可以包含它们,则可能需要过滤null
个引用。
您可以使用(unsafe
上下文)估算在锯齿状数组中存储引用的成本:
A.Length * sizeof(IntPtr)
答案 1 :(得分:1)
我不相信有任何内置功能。</ p>
很快就把它鞭打了,但是没有经过彻底的测试;
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;
}
答案 2 :(得分:1)
我只是修改了Rob的getSize方法来使用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;
}