情况如下:
我列出了哪些存储字符串实际上是数字并且可以变得非常大(数亿个项目)。
我将数字存储为字符串,因为可以选择显示一些附加信息,即文本。
因为这需要大量内存来存储,所以我决定最多只存储 500 万个项目。(这只需要大约 250-300mb)。
该列表由计算的输出填充。如果找到一个数字,它将被添加到列表中,这个数字总是大于现有项目。
当列表达到 5 百万时,我想删除第一个项目并将新项目添加到列表中。
像:
// 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);