0
我在C#中有一個程序,需要使用1GB的內存。但是我使用一些需要額外RAM的適配器代碼。看來我在運行時不能分配超過400MB的空間。如何在C#中爲我的應用程序獲取更多內存?
你能指出我在正確的優化方向嗎?
private static void FillHashTable()
{
precomputed = new Hashtable((Int32)(50 * 1000000));
var htFileNames = Directory.EnumerateFiles("precomputed_bin");
var input = new Byte[40000000]; // 40MB
var decoded = new UInt32[input.Length/4]; // 40MB
foreach (var htFileName in htFileNames)
{
try
{
hStream = new FileStream(htFileName, FileMode.Open);
}
catch (Exception e)
{
if (hStream == null)
return;
hStream.Close();
Console.WriteLine(e.ToString());
return;
}
var br = new BinaryReader(hStream);
input = br.ReadBytes((int)hStream.Length);
Buffer.BlockCopy(input, 0, decoded, 0, input.Length);
foreach (var n in decoded)
precomputed.Add(n.GetHashCode(), n); // 40MB per iter
// close
br.Close();
br.Dispose();
decoded = null;
hStream.Close();
hStream = null;
GC.Collect();
}
SerializeHashtable();
}
到目前爲止,只有40%的數據可以加載,我需要它在RAM中。
我應該使用C++來避免垃圾收集的不確定時間嗎? (我現在的首選)
或者我應該把輸入分成塊來重用它們並避免開銷?
我是否正確釋放資源或GC失敗?
我應該以某種方式通知操作系統我需要超過1GB?
謝謝!
Thanx,但它的C# - 我現在添加到我的話題。 該內存是一個巨大的(1GB)哈希表,用於確定6字節數是否爲O(1)時間的素數。 我的任務是處理一個文件(可能很大)並找到最長的素數序列。 所以,看來我真的需要這個1GB的我的手:( 它'有點STANGE是CLR給我唯一的400MB,或者是Win64的限制?對此表示懷疑。 Offcourse的大數字(超過5億)我在運行時檢查素數 – sdd
我確定有一種方法可以在.NET運行時配置中進行調優,但我並沒有具體怎麼做,你可以查看MSDN。 難道你不能寫散列表到磁盤,然後在搜索時加載其中的一部分?如果表以磁盤的最佳方式對磁盤進行排序或索引,那麼你可能會達到你的複雜度目標 –
我會嘗試調整.NET,謝謝! – sdd