Warning: file_get_contents(/data/phpspider/zhask/data//catemap/4/jquery-ui/2.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
.net 收藏一百万件物品的最佳收藏品?_.net_Performance_Collections - Fatal编程技术网

.net 收藏一百万件物品的最佳收藏品?

.net 收藏一百万件物品的最佳收藏品?,.net,performance,collections,.net,Performance,Collections,我想问一个对我感兴趣的问题 如果集合包含大量超过100万项,则根据标准,哪个集合的性能最好 通过示例,我创建了简单的List10000000集合,并尝试添加大约500000个不同的项目。前30000个项目将在运行后10秒内添加,但集合将在运行后1分钟内仅包含60000个项目,在5分钟内包含150000个项目 据我所知,通过添加新项,集合中的内存使用存在非线性依赖关系,因为每个项都是在类似的相等时间段内创建的。但我可能会犯错误 编辑: 你说得对,没有样品就不够清楚。 我正在尝试将树填充为连接列表。

我想问一个对我感兴趣的问题

如果集合包含大量超过100万项,则根据标准,哪个集合的性能最好

通过示例,我创建了简单的List10000000集合,并尝试添加大约500000个不同的项目。前30000个项目将在运行后10秒内添加,但集合将在运行后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.Selectn=>n.Id.Max+1;非常感谢您的回答和评论。

如果您想添加一百万个项目,请按以下方式创建:

var myList = new List<MyItem>(1500000);

存储150万个引用或小型结构并不昂贵,让List的自适应增长算法分配空间将非常昂贵

如果要添加一百万个项目,请按如下方式创建:

var myList = new List<MyItem>(1500000);

存储150万个引用或小型结构并不昂贵,让List的自适应增长算法分配空间将非常昂贵

如果您事先确切知道有多少个数组,那么您需要一个数组。如果您可以分配一次,然后简单地填充,那么一个简单的数组就是完美的。没有浪费内存,填充速度最快,删除速度最快。

如果您事先知道阵列的数量,那么您需要一个阵列。如果您可以分配一次,然后简单地填充,那么一个简单的数组就是完美的。没有浪费的内存,最快的填充速度,最快的删除速度。

答案是这取决于它。你要做很多没有排序的插入吗?链表 你会做大量的查找吗?哈希映射/字典 你会有一组杂乱无章的东西吗?列表和/或数组 你不想要复制品吗?设置 是否不希望重复,但希望快速查找?哈希集
您是否有按键排序的有序列表?树形图这一问题的答案是这要看情况而定。你要做很多没有排序的插入吗?链表 你会做大量的查找吗?哈希映射/字典 你会有一组杂乱无章的东西吗?列表和/或数组 你不想要复制品吗?设置 是否不希望重复,但希望快速查找?哈希集
您是否有按键排序的有序列表?TreeMap

当您处理数百万或更多项目时,最好使用数组。即使通过使阵列比绝对需要的大而浪费了数千个插槽,所获得的时间效率也可能弥补空间效率的损失


当然,如果处理的数据量太大,无法完全存储在内存中,则建议使用基于磁盘的数据结构。

当处理数百万或更多项目时,最好使用阵列。即使通过使阵列比绝对需要的大而浪费了数千个插槽,所获得的时间效率也可能弥补空间效率的损失


当然,如果处理的数据量太大,无法完全存储在内存中,则建议使用基于磁盘的数据结构。

除非阵列只创建一次并在应用程序的生命周期内存在,否则我倾向于建议使用某种类型的嵌套阵列,其中,如果每个数组包含任何双精度浮点数,则每个数组的大小保持在8000字节以下;如果不包含任何双精度浮点数,则每个数组的大小保持在85000字节以下。大小为的对象被放置在大型对象堆上。与普通堆不同,普通堆可以有效地处理许多对象的创建和放弃,而大型对象堆在.NET2.0-3.5下处理得不好,在4.0下处理得更好

如果不进行插入或删除,我建议使用1024个数组(每个数组包含1024个元素)可能是最简单的方法。通过索引访问元素只需将索引右移10,使用结果选择数组,然后使用底部10位查找数组中的项


如果需要插入和删除,我建议使用锯齿状数组和某种数据结构来跟踪每个子数组的逻辑长度,并帮助将索引转换为数组位置。这样做可以避免在执行插入或删除操作时需要复制大量数据,而代价是更昂贵的订阅操作。

除非数组只创建一次并在应用程序的生命周期内存在,否则我倾向于建议使用某种类型的嵌套数组,其中每个数组的大小保持在8以下 如果包含任何双精度浮点数,则为1000字节;如果不包含,则为85000字节。大小为的对象被放置在大型对象堆上。与普通堆不同,普通堆可以有效地处理许多对象的创建和放弃,而大型对象堆在.NET2.0-3.5下处理得不好,在4.0下处理得更好

如果不进行插入或删除,我建议使用1024个数组(每个数组包含1024个元素)可能是最简单的方法。通过索引访问元素只需将索引右移10,使用结果选择数组,然后使用底部10位查找数组中的项



如果需要插入和删除,我建议使用锯齿状数组和某种数据结构来跟踪每个子数组的逻辑长度,并帮助将索引转换为数组位置。这样做可以避免在执行插入或删除操作时需要复制大量数据,而代价是更昂贵的订阅操作。

您的内存中是否有足够的空间容纳一百万个项目?您正试图对这么多的项目执行什么操作?我想这取决于您将如何使用集合。您是要进行大量查找,还是只是要对集合进行迭代?也许数组会是一个更好的选择?您对数据结构的选择不仅应该考虑内存分配,还应该考虑您将其用于何种用途。你能解释一下你将如何处理这些数据吗?如果你想对这些数字发表严肃的评论,请发布工作代码。你的内存中是否有足够的空间容纳这一百万件物品?你到底想用这么多的物品做什么?我想这取决于你打算用这些收藏品做什么。您是要进行大量查找,还是只是要对集合进行迭代?也许数组会是一个更好的选择?您对数据结构的选择不仅应该考虑内存分配,还应该考虑您将其用于何种用途。你能解释一下你将如何处理这些数据吗?如果你想对这些数字发表严肃的评论,请发布工作代码。我使用同样的方法创建集合。可能,问题在于在递归函数中使用堆栈…我使用相同的方法创建集合。可能,问题是在递归函数中使用堆栈…谢谢。但我只想尽可能快地填写我的列表:@Maxim如果你只想尽可能快地填写列表,为什么还要费事做任何事情呢?想必你想以某种方式将这些项目从列表中删除,这将对您使用的数据结构产生很大影响。@Jason我只是想创建树\图,以某种自定义链表的形式显示-但是当我的示例在很多时候创建链表时,我感到奇怪,并认为性能问题涉及到许多项,大约100万项,但我发现问题在于linq使用内部递归函数。谢谢你的反馈,谢谢。但我只想尽可能快地填写我的列表:@Maxim如果你只想尽可能快地填写列表,为什么还要费事做任何事情呢?想必你想以某种方式将这些项目从列表中删除,这将对您使用的数据结构产生很大影响。@Jason我只是想创建树\图,以某种自定义链表的形式显示-但是当我的示例在很多时候创建链表时,我感到奇怪,并认为性能问题涉及到许多项,大约100万项,但我发现问题在于linq使用内部递归函数。感谢您的所有反馈。最好使用数组。我不同意。初始化为适当容量的列表将具有类似的空间要求,并且更灵活—最好使用阵列。我不同意。初始化为适当容量的列表将具有类似的空间需求,并且更加灵活