2013-05-17 51 views
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?

謝謝!

回答

0

如果這是Java(您沒有說),那麼您可以使用指定的-Xmx參數啓動jvm。另外,您可能會重新考慮您的應用程序是否真的需要一次將所有內容加載到內存中。

+0

Thanx,但它的C# - 我現在添加到我的話題。 該內存是一個巨大的(1GB)哈希表,用於確定6字節數是否爲O(1)時間的素數。 我的任務是處理一個文件(可能很大)並找到最長的素數序列。 所以,看來我真的需要這個1GB的我的手:( 它'有點STANGE是CLR給我唯一的400MB,或者是Win64的限制?對此表示懷疑。 Offcourse的大數字(超過5億)我在運行時檢查素數 – sdd

+0

我確定有一種方法可以在.NET運行時配置中進行調優,但我並沒有具體怎麼做,你可以查看MSDN。 難道你不能寫散列表到磁盤,然後在搜索時加載其中的一部分?如果表以磁盤的最佳方式對磁盤進行排序或索引,那麼你可能會達到你的複雜度目標 –

+0

我會嘗試調整.NET,謝謝! – sdd

相關問題