gpt4 book ai didi

c# - 管理带有移动项目的列表的(几乎)最佳方法

转载 作者:太空狗 更新时间:2023-10-29 17:55:13 25 4
gpt4 key购买 nike

情况是这样的:
我列出了存储字符串的列表,这些字符串实际上是数字并且可以变得非常大(数亿个项目)。
我将数字存储为字符串,因为可以选择显示一些附加信息,即文本。

因为这需要大量内存来存储,所以我决定最多只存储 500 万个项目。 (这只需要大约 250-300mb)。

列表由计算的输出填充。如果找到一个数字,它将被添加到列表中,这个数字总是大于现有的项目。

当列表达到 500 万时,我想删除第一个项目并将新项目添加到列表中。

喜欢:

    // Why is this so freaking slow???
if (_result.Count == 5000000)
_result.RemoveAt(0);
_result.Add(result);

正如您在评论中看到的那样,这非常、非常、非常慢。它只是将我的性能降低了 15 倍。过去需要 2 分钟,现在大约需要 30 分钟。

我用 linq 尝试了一些东西,比如 .Skip(1).ToList 但这会重新创建列表,因此速度更慢。

列表必须保持正确的顺序,因此不能通过索引覆盖(除非您可以解释一个很好的解决方法)。

我的问题:
有什么好的方法可以做到这一点吗?

我真的需要这里的性能,因为它可能需要检查大约 10000000000 个数字。这当然可能需要一天,但一个月有点太多了:(。

需要更多信息,请随时询问,我很乐意提供。

解决方案:
这执行 O(1)

    // Set the _result
Queue<object> _result = new Queue<object>(5000000);

/// Inside the method
// If the count has reach it's max, dequeue the first item
if (_result.Count == 5000000)
_result.Dequeue();
_result.Enqueue(result);

最佳答案

您曾经重新订购过商品吗?如果不这样做,循环队列会工作得很好。

System.Collections.Generic.Queue 是其中之一,我刚刚仔细检查过。

为了扩展队列的好处,这是 RemoveAt 实现(大致):

for (int i = 1; i < count; i++)
items[i-1] = items[i];
count--;

因为 list[0] 始终是第一项,所以您必须移动所有内容才能删除第一项。

相比之下,队列单独跟踪第一个项目。这会将上面的代码更改为:

head++

关于c# - 管理带有移动项目的列表的(几乎)最佳方法,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/12517910/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com