我试图压缩一个大的8gb文件并将压缩的文件上传到Blob中。压缩文件大小约为800 to。现在,当我尝试上传到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
发布于 2012-10-21 17:27:02
您很少像这样将一个巨大的文件加载到内存中。您通常应该做的是使用一个小缓冲区(8k、16k等)循环,并将其作为流上传。取决于整个场景是什么,也许只是:
blob.UploadFromStream(compressedStream);如果您需要做预处理工作(而且您不能按原样传递流),那么使用一个临时文件(同样,通过一个小型缓冲区进行压缩/解压),然后将文件流传递到上传API。
溪流的全点是软管,而不是水桶。您不应该尝试将其同时存储在内存中。
有对象大小和数组大小限制,阻止您有一个8GB字节数组。当有要求这样做的时候--,有一些加载大型对象的坏方法,但是:在这种情况下,这是完全不合适的。简单地说-您只需要正确地使用流API。
发布于 2012-10-21 17:29:25
可能有两个问题,因为这并不是真正清楚的从你的帖子。
1)这可能是.NET框架的肯定,如果您的代码是编写的而不是针对64bit体系结构的。在这种情况下,您的CLR进程有3GB (非常近似)的内存限制。
2)您的代码是一个“原生”64位应用程序:因此您分配了太多的内存。可能的解决办法:
a)减少数据传输到内存块(如果这在您的情况下是可能的话)
( b)使用流,不要加载所有数据(如果可能的话)
编辑
此外,正如Marc注意到的:CLR (独立于体系结构)中的数组还有另一个内存限制,在您的情况下可能也会超过这个限制。
希望这能有所帮助。
https://stackoverflow.com/questions/13000230
复制相似问题