状況は次のとおりです。
実際には数値であり、かなり大きくなる可能性のある文字列を格納するリストがあります(数億のアイテム)。
テキストである追加情報を表示するオプションがあるため、数値を文字列として保存します。
これは保存に大量のメモリを必要とするため、最大 500 万個のアイテムのみを保存することにしました。(これには約 250 ~ 300MB しかかかりません)。
リストは、計算の出力によって埋められます。数値が見つかった場合、それはリストに追加されます。この数値は常に既存のアイテムよりも大きくなります。
リストが 5 ミルに達したら、最初のアイテムを削除して、新しいアイテムをリストに追加します。
お気に入り:
// Why is this so freaking slow???
if (_result.Count == 5000000)
_result.RemoveAt(0);
_result.Add(result);
コメントでわかるように、これは非常に非常に遅いです。パフォーマンスが 15 分の 1 に低下しました。2分かかったところが、今では約30分かかります。
私はlinqのようなものをいくつか試しました.Skip(1).ToList
が、それはリストを再作成するため、さらに遅くなります。
リストは正しい順序に保つ必要があるため、インデックスによる上書きはオプションではありません (適切な回避策を説明できる場合を除きます)。
私の質問:
これを行う適切な方法はありますか?
約 10000000000 の数字をチェックする必要があるかもしれないので、ここでのパフォーマンスが本当に必要です。もちろん、これには1日かかるかもしれませんが、1か月は少し長すぎます:(。
追加情報が必要な場合は、お気軽にお問い合わせください。喜んで提供いたします。
解決策:
これは 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);