Warning: file_get_contents(/data/phpspider/zhask/data//catemap/4/matlab/13.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Memory 如何在C#中为我的应用程序获取更多内存?_Memory_Io_Out Of Memory_Ram - Fatal编程技术网

Memory 如何在C#中为我的应用程序获取更多内存?

Memory 如何在C#中为我的应用程序获取更多内存?,memory,io,out-of-memory,ram,Memory,Io,Out Of Memory,Ram,我有一个C#语言的程序,需要使用1GB的内存。然而,我使用一些适配器代码,这需要额外的RAM。看来我在运行时分配的内存不能超过400MB 你能给我指出优化的正确方向吗 private static void FillHashTable() { precomputed = new Hashtable( (Int32)( 50 * 1000000 ) ); var htFileNames = Directory.EnumerateFiles( "precomputed_bin" );

我有一个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的内存

谢谢大家!

如果这是Java(您没有说),那么可以使用指定的-Xmx参数启动jvm


此外,你可能会重新考虑你的应用程序是否真的需要立即将所有这些内容加载到内存中。

Thanx,但它是
s C#-我现在将此添加到我的主题中。这个内存是一个巨大的(1GB)哈希表,用于确定6字节的数字在O(1)时间内是否为素数。我的任务是处理一个文件(可能很大)并找到最长的素数序列。所以,我似乎真的需要这1GB的内存:(这有点像CLR只给了我400MB的内存。或者是Win64限制?对此表示怀疑。当然是大数字(超过50亿)我会在运行时检查素性。我确信有一种方法可以在.NET运行时配置中对此进行调整,但我不知道具体如何进行。您可以检查MSDN。您是否可以将哈希表写入磁盘,然后在搜索时加载部分哈希表?如果磁盘上的表以最适合此任务的方式进行排序或索引,则您可以可能会达到你的目标。