我正在尝试压缩一个 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/