我正在尝试压缩一个 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 问题还是任何地址空间问题。
请帮助我解决这个问题

-马亨德

-马亨德

最佳答案

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

blob.UploadFromStream(compressedStream);

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

流的 整点 是它是软管而不是桶。您 不应该 尝试将其全部放入内存中。

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

关于c# - 上传 Blob 时抛出了 'System.OutOfMemoryException' 类型的异常,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/13000230/

10-11 23:02
查看更多