我想問一個感興趣的(對我來說)問題。持有一百萬件物品的最佳收藏?
如果集合包含很多項目(超過100萬),那麼什麼樣的集合是最好的標準性能。
舉例來說,我創建了簡單的List(10000000)集合並嘗試添加大約500000個不同的項目。運行結束後10秒內首先添加30000件物品,但運行後1分鐘內收集的物品只有60000件,5分鐘後物品150000件。
據我所知,通過添加新項目(因爲每個項目都在「類似等於」時間段內創建),內存使用在收集中存在非線性依賴關係。但我可以犯一個錯誤。
編輯: 你是對的,如果沒有樣本,它是不夠清楚。 我想填充樹作爲連接列表。 您可以在下面找到示例代碼。
public class Matrix
{
public int Id { get; private set; }
public byte[,] Items { get; private set; }
public int ParentId { get; private set; }
public int Lvl { get; private set; }
public int HorizontalCounts
{
get { return 3; }
}
public int VerticalCounts
{
get { return 3; }
}
public Matrix(int id) : this(id, null, 0, 1)
{
}
public Matrix(int id, byte[,] items, int parentId, int lvl)
{
Id = id;
Items = (items ?? (new byte[HorizontalCounts, VerticalCounts]));
ParentId = parentId;
Lvl = lvl;
}
public bool IsEmpty(int hCounter, int vCounter)
{
return (Items[hCounter, vCounter] == 0);
}
public Matrix CreateChild(int id)
{
return (new Matrix(id, (byte[,])Items.Clone(), Id, (Lvl + 1)));
}
}
public class Program
{
public static void Main(string[] args)
{
Matrix node = new Matrix(1);
const int capacity = 10000000;
List<Matrix> tree = new List<Matrix>(capacity) { node };
FillTree(ref tree, ref node);
int l1 = tree.Where(n => (n.Lvl == 1)).Count();
int l2 = tree.Where(n => (n.Lvl == 2)).Count();
int l3 = tree.Where(n => (n.Lvl == 3)).Count();
int l4 = tree.Where(n => (n.Lvl == 4)).Count();
int l5 = tree.Where(n => (n.Lvl == 5)).Count();
}
private static void FillTree(ref List<Matrix> tree, ref Matrix node)
{
for (int hCounter = 0; hCounter < node.HorizontalCounts; hCounter++)
{
for (int vCounter = 0; vCounter < node.VerticalCounts; vCounter++)
{
if (!node.IsEmpty(hCounter, vCounter))
{
continue;
}
int childId = (tree.Select(n => n.Id).Max() + 1);
Matrix childNode = node.CreateChild(childId);
childNode.Items[hCounter, vCounter] = 1;
tree.Add(childNode);
FillTree(ref tree, ref childNode);
}
}
}
}
最新版本:我很抱歉,問題是沒有在項目的數量到需要的集合。性能問題在這一行:int childId =(tree.Select(n => n.Id).Max()+ 1);非常感謝您的回答和評論。
您是否有足夠的空間容納百萬件物品? – 2010-09-03 12:38:49
這是什麼,你試圖用這麼多項目? – 2010-09-03 12:39:28
我認爲這取決於你將要使用的集合。你打算做很多查找還是要迭代集合?也許一個數組會是一個更好的選擇? – 2010-09-03 12:40:53