Wil*_*vin 6 c# compression gzip out-of-memory gzipstream
我有很多大的gzip文件(大约10MB - 200MB),我从ftp下载解压缩.
所以我试着google并找到一些gzip解压缩的解决方案.
static byte[] Decompress(byte[] gzip)
{
using (GZipStream stream = new GZipStream(new MemoryStream(gzip), CompressionMode.Decompress))
{
const int size = 4096;
byte[] buffer = new byte[size];
using (MemoryStream memory = new MemoryStream())
{
int count = 0;
do
{
count = stream.Read(buffer, 0, size);
if (count > 0)
{
memory.Write(buffer, 0, count);
}
}
while (count > 0);
return memory.ToArray();
}
}
}
Run Code Online (Sandbox Code Playgroud)
它适用于50mb以下的任何文件但是一旦我输入超过50mb我得到系统内存异常.异常之前的最后位置和内存长度是134217728.我不认为它与我的物理内存有关系,我知道我使用32位时不能有超过2GB的对象.
我还需要在解压缩文件后处理数据.我不确定内存流是否是最好的方法,但我不喜欢写入文件,然后再次读取文件.
我的问题
MemoryStream的内存分配策略对于海量数据并不友好。
由于 MemoryStream 的约定是使用连续数组作为底层存储,因此它必须经常为大流重新分配数组(通常为 log2(size_of_stream))。这种重新分配的副作用是
因此,通过 MemoryStream 处理大型 (100Mb+) 流可能会在 x86 系统上出现内存不足异常。此外,返回数据的最常见模式是像您一样调用 GetArray,这还需要与用于 MemoryStream 的最后一个数组缓冲区大约相同的空间量。
解决办法:
| 归档时间: |
|
| 查看次数: |
4559 次 |
| 最近记录: |