C# 使用MemoryStream写入大文件时发生OutOfMemory异常

C# 使用MemoryStream写入大文件时发生OutOfMemory异常,c#,memory,C#,Memory,我正在尝试使用MemoryStream保存一个大文件(~2GB)。我的服务器有大约6-8GB的RAM,但即使这样,当我将文件加载到MemoryStream对象时,也会出现OutOfMemoryException。我需要将文件作为字节数组加载,以便在其上运行防病毒进程,因此没有选择将其分块 目前,我以这种方式加载字节数组: public static byte[] ReadBytes(this Stream inputStream) { if (inputStrea

我正在尝试使用
MemoryStream
保存一个大文件(~2GB)。我的服务器有大约6-8GB的RAM,但即使这样,当我将文件加载到MemoryStream对象时,也会出现OutOfMemoryException。我需要将文件作为字节数组加载,以便在其上运行防病毒进程,因此没有选择将其分块

目前,我以这种方式加载字节数组:

    public static byte[] ReadBytes(this Stream inputStream)
    {
        if (inputStream == null)
        {
            return new byte[0];
        }

        if (inputStream.CanSeek && inputStream.Position > 0)
        {
            inputStream.Position = 0;
        }

        // Load by 16KB chunks
        var buffer = new byte[16 * 1024];

        using (var ms = new MemoryStream())
        {
            int read;
            while ((read = inputStream.Read(buffer, 0, buffer.Length)) > 0)
            {
                ms.Write(buffer, 0, read);
            }
            if (inputStream.CanSeek) inputStream.Position = 0;
            return ms.ToArray();
        }
    }
我能做些什么来避免这个错误吗


谢谢。

预先指定MemoryStream的大小可能会有所帮助,但这会推迟不可避免的事情。问题是
MemoryStream
需要约2GB的连续内存,而这些内存可能不可用。如果您需要它立即进入内存,并且需要它进入
,那么您可能缺少选项。如果您可以在启动时分配一个~2GB字节的存储阵列,然后在启动后重新使用,您应该会获得更高的可靠性。这是否回答了您的问题?>>“我需要将文件作为字节数组加载,以便在其上运行防病毒进程,因此没有选择将其分块。”-我将详细说明您为什么认为。。。我看不出你需要立即加载整个文件的任何原因。。。如果是这样的话,我会寻找一个更好的“反病毒程序”@Milney我正在使用赛门铁克的反病毒扫描和
StreamScanRequest
。它需要流。如果它只需要流,你不能给它传递一个文件流吗?