为什么我在使用此代码时遇到System.OutOfMemoryException?

问题描述:

Dim output1 = System.IO.File.ReadAllLines(file).ToString 

文件大小只有1 GB。我的页面文件是128 GB。为什么内存不足?这是64位系统。为什么我在使用此代码时遇到System.OutOfMemoryException?

因为有很多不同的因素进入OOM例外。从"Out Of Memory" Does Not Refer to Physical Memory开始。

的“内存不足”的错误几乎不会发生,因为没有足够的可用存储空间......相反,一个“内存不足”的错误发生,因为这个过程是无法找到连续的未使用的页的足够大的部分在其虚拟地址空间中执行请求的映射。

您还应该阅读CLR Inside Out - Investigating Memory Issues

如果虚拟内存过于分散,进程可能会用尽虚拟空间。

所以,不要只看你的文件大小和页面文件的大小,你需要检查你的应用程序正在做什么,甚至是什么其他进程在系统上运行。

我是新手,但我在我的一些更多的内存密集型应用程序的使用这段代码:


Declare Function SetProcessWorkingSetSize Lib "kernel32.dll" (ByVal process As IntPtr, ByVal minimumWorkingSetSize As Integer, ByVal maximumWorkingSetSize As Integer) As Integer 
Private Shared Sub _FlushMemory() 
    Try 
     GC.Collect() 
     GC.WaitForPendingFinalizers() 
     If (Environment.OSVersion.Platform = PlatformID.Win32NT) Then 
      SetProcessWorkingSetSize(Process.GetCurrentProcess().Handle, -1, -1) 
      Dim myProcesses As Process() = Process.GetProcessesByName(My.Application.Info.AssemblyName) 
      Dim myProcess As Process 
      For Each myProcess In myProcesses 
       SetProcessWorkingSetSize(myProcess.Handle, -1, -1) 
      Next myProcess 
     End If 
    Catch ex As Exception 
    End Try 
End Sub 
+0

这是什么?它为什么有效?如果内存运行严重不足,你会不会认为内存管理器已经为你做到了这一点? –

+0

它清除程序中未使用的内存(来自旧变量等)并将内存分配设置为尽可能最低,同时保留包含所需变量等的内存。 并且没有。当内存运行严重不足时,内存可能会被清除,但当您只想释放一些未使用的内存时,内存可能会被清除,从而使您的应用程序保持高效。我在一个定时器上使用它,并且在合理的时间间隔内,在可能需要在操作之后进行一些清理的表单上 - 您可以在任务管理器中看到,内存被降低到可能的最低程度。 (相当令人满意) – SolaGratia

只注意到你写什么也。您不能将字符串数组(String)(ReadAllLines)转换为字符串。

试试这个:

Dim output1 As String = IO.File.ReadAllText(file)

这将返回该文件的内容作为String。如果这是你想要的。

+0

那他应该怎么做呢?你会如何重写代码来修复它? –

+0

如果我一直在寻找一个字符串数组: 昏暗的输出1()作为字符串= IO.File.ReadAllLines(文件) 或者,如果我想要的文件作为字符串的内容, 昏暗输出1作为字符串= 10 .File.ReadAllText(文件) – SolaGratia