作者热门文章
- c - 在位数组中找到第一个零
- linux - Unix 显示有关匹配两种模式之一的文件的信息
- 正则表达式替换多个文件
- linux - 隐藏来自 xtrace 的命令
我有许多从 ftp 下载的大型 gzip 文件(大约 10MB - 200MB)需要解压。
所以我尝试谷歌并找到一些 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();
}
}
}
它适用于任何低于 50mb 的文件,但一旦我输入超过 50mb,我就会遇到系统内存不足异常。异常前的最后一个位置和内存长度是 134217728。我不认为它与我的物理内存有关系,我知道我不能拥有超过 2GB 的对象,因为我使用 32 位。
我还需要在解压文件后处理数据。我不确定内存流是否是这里最好的方法,但我真的不喜欢写入文件然后再次读取文件。
我的问题
最佳答案
MemoryStream 的内存分配策略对于海量数据并不友好。
由于 MemoryStream 的契约(Contract)是将连续数组作为底层存储,因此它必须经常为大流重新分配数组(通常为 log2(size_of_stream))。这种重新分配的副作用是
因此,通过 MemoryStream 处理大型 (100Mb+) 流可能会导致 x86 系统出现内存不足异常。此外,返回数据的最常见模式是调用 GetArray,这额外需要与用于 MemoryStream 的最后一个数组缓冲区大致相同的空间量。
解决方法:
关于c# - GZIP解压C# OutOfMemory,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/10423776/
我是一名优秀的程序员,十分优秀!