上传Blob时抛出了类型'System.OutOfMemoryException'的异常

时间:2012-10-21 17:21:19

标签: c# memory azure

我试图压缩一个大的8gb文件并将压缩文件上传到Blob中。压缩文件大小约为800MB。现在,当我尝试上传到Azure时,我得到异常'System.OutOfMemoryException“我压缩至少3-4个文件,同时大小为3Gb,4GB,8GB并保持上传到BLOB。

以下是压缩的代码

 public string UploadFile(string fileID, string fileName, string choice,Stream CompressedFileStream)
    {
       byte[] data = new byte[CompressedFileStream.Length];
        CompressedFileStream.Read(data, 0, data.Length);
        long fileSize = CompressedFileStream.Length;
        inputStream.Dispose();   

   }

        blob.ServiceClient.WriteBlockSizeInBytes = 4 * 1024 * 1024;
        blob.ServiceClient.ParallelOperationThreadCount = 5; 
        //this will break blobs up automatically after this size
        blob.ServiceClient.SingleBlobUploadThresholdInBytes = 12582912;
        startTime = DateTime.Now;
                    using (MemoryStream ms = new MemoryStream(data))
                    {
                        ms.Position = 0;
                        blob.UploadFromStream(ms);
                    }

我在64位Windows 2k8服务器和4GB内存上运行。是RAM问题还是任何地址空间问题。 请帮我解决这个问题

-Mahender

-Mahender

2 个答案:

答案 0 :(得分:5)

你很少将大文件加载到内存中。 通常应该做的是使用一个小的缓冲区(8k,16k等)进行循环,然后将作为流上传。取决于完整场景的内容,可能只是:

blob.UploadFromStream(compressedStream);

如果你需要进行预处理工作(并且你不能按原样传递流),那么使用临时文件(再次通过一个小的缓冲区进行压缩/解压缩),然后只需要文件流到上传API。

流的整点是它是一个软管而不是一个桶。你不应该一次尝试将它全部留在内存中。

有对象大小和数组大小限制,阻止您拥有8GB字节数组。当要求这样做时,加载大型对象有邪恶的方法,但是:在这种情况下,这将是完全不合适的。简单地说 - 您只需要正确使用流API。

答案 1 :(得分:1)

可能有两个问题,因为你的帖子并不是很清楚。

1)这可能是.NET Framework问题,如果您的代码是针对64bit架构编写的。在这种情况下,您的CLR进程的内存限制为3GB(非常近似)。

2)您的代码是“本机”64位应用程序:因此您分配了太多内存。可能的解决方案:

a)减少数据传输到内存块(如果你的情况可以这样做)

b)使用流并且不加载所有数据(如果在您的情况下可能)

编辑

此外,正如Marc注意到的那样:CLR中的数组还有另一个内存限制(独立于架构),在您的情况下也可能超出。

希望这有帮助。