我有一个C#程序,需要使用1GB的内存。但是,我使用一些需要额外RAM的适配器代码。似乎我不能在运行时分配超过400MB。
你能指出我正确的优化方向吗?
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 :(得分:0)
如果这是Java(您没说),则可以使用指定的-Xmx参数启动jvm。
此外,您可能会重新考虑您的应用是否真的需要立即将所有内容加载到内存中。