次の問題に出くわしました。
1 から 100.000.000 までのすべての数字を含むハッシュセットが必要です。次のコードを試しました:
var mySet = new HashSet<int>();
for (var k = 1; k <= 100000000; k++)
mySet.Add(k);
49mil あたりでメモリ オーバーフローが発生したため、そのコードはうまくいきませんでした。これもかなり遅く、メモリが過度に増加しました。
それから私はこれを試しました。
var mySet = Enumerable.Range(1, 100000000).ToHashSet();
ToHashSet() は次のコードです。
public static HashSet<T> ToHashSet<T>(this IEnumerable<T> source)
{
return new HashSet<T>(source);
}
再びメモリ オーバーフローが発生しましたが、前のコードよりも多くの数値を入力できました。
機能するのは次のとおりです。
var tempList = new List<int>();
for (var k = 1; k <= 100000000; k++)
tempList.Add(k);
var numbers = tempList.ToHashSet();
私のシステムでは、Enumerable.Range() が 4 ティックしかかからない tempList を埋めるのに約 800 ミリ秒かかります!
HashSetが必要です。そうしないと、値を検索するのに時間がかかります(O(1)にする必要があります)。それを最速の方法で行うことができれば素晴らしいと思います。
私の質問は次のとおり
です。最初の 2 つの方法ではメモリ オーバーフローが発生するのに、3 番目の方法では発生しないのはなぜですか?
初期化時に HashSet がメモリに対して行う特別なことはありますか?
私のシステムには 16GB のメモリが搭載されているため、オーバーフロー例外が発生したときは非常に驚きました。