如何分配更多的物理内存?

时间:2014-04-09 08:00:25

标签: c# memory

将大文件加载到内存时出现此错误。我不明白的是我的内存(由任务管理器监控仍然说只有7G在32G机器上使用)。此内存异常是指此内存的受约束部分吗?如果是这样,我该如何分配更多。产生错误的代码如下。

System.OutOfMemoryException occurred
  HResult=-2147024882
  Message=Exception of type 'System.OutOfMemoryException' was thrown.
  Source=mscorlib
  StackTrace:
       at System.IO.File.InternalReadAllBytes(String path, Boolean checkHost)
  InnerException: 

Active(x86)和64bit Windows 7

代码:

       public void LoadAllBinaries(string aKey)
        {
            if (msDatas != null)
                return;

            msDatas = new SortedDictionary<string, byte[]>();

            var dataFiles = File.ReadAllLines(G.ConfigDir + @"\dates_out.txt");
            foreach (var df in dataFiles)
            {
                try
                {
                    string fn = G.DataDir + "\\n" + aKey + df + ".dft";
                    byte[] ba = File.ReadAllBytes(fn);
                    msDatas.Add(fn,ba);
                    ba = null;
                }
                catch (Exception e)
                {
                    Console.WriteLine("OpenSLoadAllBinariestreams ERROR: " + e.Message);
                }

            }
        }

3 个答案:

答案 0 :(得分:0)

你或者某处有内存泄漏或手柄泄漏。两者都会给你Out of Memory错误。

您可以通过打开TaskManager查看是否有手柄泄漏,转到“查看”,“选择列...”,然后启用“手柄”。开始您的过程,让它运行几次迭代。记下你得到的数字。然后在几个小时后回来比较数字。如果手柄数量相当高,那么您不会处置一个比您应该的更多的对象。

同时确保处理您的物品。您也可以尝试使用System.GC.Collect进行垃圾回收。希望这会有所帮助。

答案 1 :(得分:0)

不完全确定,但您的异常堆栈跟踪说

at System.IO.File.InternalReadAllBytes(String path, Boolean checkHost)

对我来说,看起来下面的代码行是罪魁祸首而且它抛出OOM异常导致最可能的dates_out.txt大小足够高。

File.ReadAllLines(G.ConfigDir + @"\dates_out.txt")

您正在阅读的文件dates_out.txt的大小是多少?如果它的大小为GB,则尝试逐行读取,而不是一次读取整个文件(正如其他人对评论的建议)。

修改

如果要查看程序对象的当前内存消耗,则可以使用GC.GetTotalMemory方法获取它。您还可以使用windbg.exe toolMicrosoft’s CLR Profiler

long memoryUsed = GC.GetTotalMemory (true);

答案 2 :(得分:0)

在visual studio中,转到Project Properties和Build屏幕。检查选择任何CPU的位置是否未选中Prefer 32 bit的平台目标复选框。

你也可以在那里明确选择x64。

这为我解决了同样的错误。