我试图压缩一个大的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
答案 0 :(得分:5)
你很少将大文件加载到内存中。 通常应该做的是使用一个小的缓冲区(8k,16k等)进行循环,然后将作为流上传。取决于完整场景的内容,可能只是:
blob.UploadFromStream(compressedStream);
如果你需要进行预处理工作(并且你不能按原样传递流),那么使用临时文件(再次通过一个小的缓冲区进行压缩/解压缩),然后只需要文件流到上传API。
流的整点是它是一个软管而不是一个桶。你不应该一次尝试将它全部留在内存中。
有对象大小和数组大小限制,阻止您拥有8GB字节数组。当要求这样做时,加载大型对象有邪恶的方法,但是:在这种情况下,这将是完全不合适的。简单地说 - 您只需要正确使用流API。
答案 1 :(得分:1)
可能有两个问题,因为你的帖子并不是很清楚。
1)这可能是.NET Framework问题,如果您的代码是针对64bit
架构编写的非。在这种情况下,您的CLR
进程的内存限制为3GB(非常近似)。
2)您的代码是“本机”64位应用程序:因此您分配了太多内存。可能的解决方案:
a)减少数据传输到内存块(如果你的情况可以这样做)
b)使用流并且不加载所有数据(如果在您的情况下可能)
编辑
此外,正如Marc注意到的那样:CLR
中的数组还有另一个内存限制(独立于架构),在您的情况下也可能超出。
希望这有帮助。