将大文件加载到内存时出现此错误。我不明白的是我的内存(由任务管理器监控仍然说只有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);
}
}
}
答案 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 tool
或Microsoft’s CLR Profiler
long memoryUsed = GC.GetTotalMemory (true);
答案 2 :(得分:0)
在visual studio中,转到Project Properties和Build屏幕。检查选择任何CPU的位置是否未选中Prefer 32 bit的平台目标复选框。
你也可以在那里明确选择x64。
这为我解决了同样的错误。