3

Im trying to compress a large 8gb file and upload the compressed file into Blob. The Compressed File Size comes to around 800MB. Now when i try to upload into Azure, I get exception' System.OutOfMemoryException" Im Compressing atleast 3-4 Files while are of size 3Gb, 4GB, 8GB in parallel and Keep the uploading into BLOB.

Here is the code for Compressing

 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);
                    }

Im runnning on 64 bit windows 2k8 server and 4GB ram. Is it RAM Issue or Any Address Space Issue. Please help me on this issue

-Mahender

-Mahender

4

2 回答 2

5

您很少像这样将大文件加载到内存中。您通常应该做的是循环使用较小的缓冲区(8k、16k 等),并将其作为流上传。取决于完整的场景是什么,也许只是:

blob.UploadFromStream(compressedStream);

如果您需要进行预处理工作(并且您不能按原样传递流),则使用临时文件(再次,通过较小的缓冲区进行压缩/解压缩),然后将文件交给 -流到上传 API。

溪流的全部意义在于它是软管而不是水桶。您不应该尝试一次将所有内容都保存在内存中。

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

于 2012-10-21T17:27:02.803 回答
1

可能有 2 个问题,因为您的帖子并不清楚。

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

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

a)减少数据传输到内存块中(如果这在您的情况下是可能的)

b)使用流并且不加载所有数据(如果可能的话)

编辑

此外,正如 Marc 注意到的那样:数组 in CLR(independent from the architecture) 还有另一个内存限制,在您的情况下也可能超过。

希望这可以帮助。

于 2012-10-21T17:29:25.937 回答