GZIP解压 C# OutOfMemory

2023-11-25

我有许多从 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位。

我还需要在解压文件后处理数据。我不确定内存流是否是最好的方法,但我真的不喜欢写入文件,然后再次读取文件。

我的问题

  • 为什么我会收到 System.OutofMemoryException?
  • 解压缩 gzip 文件并随后进行一些文本处理的最佳解决方案是什么?

MemoryStream的内存分配策略对于海量数据并不友好。

由于 MemoryStream 的约定是使用连续数组作为底层存储,因此它必须经常为大流重新分配数组(通常为 log2(size_of_stream))。这种重新分配的副作用是

  • 重新分配时的长时间复制延迟
  • 新数组必须适合已被先前分配严重碎片化的空闲地址空间
  • 新数组将位于有其怪癖的 LOH 堆上(没有压缩,在 GC2 上收集)。

因此,通过 MemoryStream 处理大型 (100Mb+) 流可能会在 x86 系统上出现内存不足异常。此外,返回数据的最常见模式是像您一样调用 GetArray,这还需要与用于 MemoryStream 的最后一个数组缓冲区大约相同的空间量。

解决办法:

  • 最便宜的方法是预先将 MemoryStream 增长到您需要的近似大小(最好稍微大一些)。您可以通过读取不存储任何内容的假流来预先计算所需的大小(浪费 CPU 资源,但您将能够读取它)。还可以考虑返回流而不是字节数组(或返回 MemoryStream 缓冲区的字节数组以及长度)。
  • 如果您需要整个流或字节数组,处理它的另一个选择是使用临时文件流而不是 MemoryStream 来存储大量数据。
  • 更复杂的方法是实现将底层数据分块为较小(即 64K)块的流,以避免在流需要增长时在 LOH 上进行分配和复制数据。
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

GZIP解压 C# OutOfMemory 的相关文章

  • 如何创建语法突出显示文本框[关闭]

    Closed 这个问题需要多问focused help closed questions 目前不接受答案 如何使用 C Net 创建语法突出显示文本框 Take 闪烁网 http scintillanet codeplex com 并采取其
  • C语言实现延时函数

    我想使用空循环实现延迟函数 但是完成一次循环所需的时间取决于编译器和机器 我希望我的程序自行确定时间并将程序延迟指定的时间 谁能给我任何想法如何做到这一点 注意 有一个名为delay 的函数可以将系统暂停指定的毫秒 是否可以在不使用此功能的
  • C++:字符串流有什么好处?

    谁能告诉我一些在 C 中使用字符串流的实际例子 即使用流插入和流提取运算符输入和输出到字符串流 您可以使用字符串流来转换任何实现operator lt lt 到一个字符串 include
  • Monitor.Pulse & Wait - 意外行为

    http www codeproject com Articles 28785 Thread synchronization Wait and Pulse demystified http www codeproject com Artic
  • 为什么 fgets 接受 int 而不是 size_t?

    功能如strcpy malloc strlen 和其他各种接受他们的参数或返回值作为size t代替int or an unsigned int出于显而易见的原因 一些文件功能 例如fread and fwrite use size t以及
  • 带有嵌入 Flash 视频的 PDF 示例?

    有谁知道我在哪里可以查看嵌入 Flash 视频的 PDF 示例 我知道问这个问题很愚蠢 因为你会认为任何面向技术的用户都应该能够使用谷歌找到一个 但我真的找不到 我的另一个问题是 使用 C 中的 API 将 Flash 视频嵌入 PDF 文
  • UI 线程正在阻塞调用 COM 对象的后台线程

    我正在开发一个通过第三方 COM 库与外部设备通信的应用程序 我试图让与设备的所有通信都通过后台线程 以防止通信问题搞砸我的应用程序 并消除在 UI 线程中进行通信所引入的一些其他复杂性 问题是 每当发生导致主 UI 线程阻塞的情况 即调用
  • 如何在Unity Inspector中创建多维数组?

    如何在 Unity Inspector 中创建枚举多维数组并使其可序列化 以便我可以从不同的脚本调用它 public enum colors red blue green yellow cyan white purple public in
  • 将 std::pair const 转换为 std::pair const 安全吗?

    理论上或实践上 安全吗reinterpret cast a std pair
  • 如何将输出重定向到 boost 日志?

    我有一个使用boost log的C 程序 我加载了用户提供的动态链接库 我想将 stderr 重定向到 boost 日志 以便用户的库随时执行以下操作 std cerr lt lt Some stuff 它产生相同的结果 BOOST LOG
  • 如何在 C 语言中获取输入中的空格

    我想从控制台获取字符数组 它还包含空格 我在 C 中知道的唯一方法是 scanf 但是一旦遇到空格 它就会停止接受输入 我该做什么 这就是我正在做的事情 char address 100 scanf s address 尝试使用 fgets
  • “DeploymentItem”属性是什么意思?

    假设我们有一个简短的程序 namespace ConsoleTryIt static class Program static void Main string args var sum Add 1 2 private static int
  • 如何将 Boost Spirit 自动规则与 AST 结合使用?

    编辑 当我想在另一个规则上使用它时 我扩展了 sehe 的示例以显示问题 http liveworkspace org code 22lxL7 http liveworkspace org code 22lxL7 17 我正在尝试提高 Bo
  • C++ 模板参数数量错误(2,应该是 1)

    我使用 C 并行快速排序程序进行了测试 如下所示 首先使用列表作为容器 然后我转移到通用容器类型 但它报告了标题错误 可以帮忙解决这个问题吗 include
  • Rx 在不同的线程上生产和消费

    我试图通过此处的示例代码来简化我的问题 我有一个生产者线程不断地输入数据 并且我尝试在批次之间添加时间延迟来对其进行批处理 以便 UI 有时间渲染它 但结果并不如预期 生产者和消费者似乎在同一个线程上 我不希望批处理缓冲区在正在生成的线程上
  • 如何解决 boost::multi precision::cpp_dec_float 除法错误

    除以boost multiprecision cpp dec float有某种舍入误差 如下 include
  • 为什么我无法通过 lambda 捕获“this”指针?

    考虑以下代码 class A public void foo auto functor this A a this auto functor a The compiler won t accept this instead of a a g
  • C++ 在预处理器 #if 中对 sizeof() 比较抛出编译错误

    我有这个 它不会从 Visual Studio 编译错误 致命错误 C1017 无效的整数常量表达式 我该怎么做 template
  • 如何使用 .NET 捕获我的桌面视频?

    我想知道是否有任何方法可以使用 NET 捕获我的桌面的视频 截屏视频 我并不是在寻找截屏软件 而只是在寻找一种可以让我自己生成桌面视频的技术 我想过拍摄多个屏幕截图 但我不确定如何以编程方式生成带有图像序列的视频 有人有主意吗 Thanks
  • 为什么 INT64_MIN 的定义不同?为什么他们的行为不同?

    The stdint h我公司的标题是 define INT64 MIN 9223372036854775808LL 但在我项目的一些代码中 一位程序员写道 undef INT64 MIN define INT64 MIN 92233720

随机推荐

  • varchar 是否会因数据碎片而导致性能下降?

    数据库引擎如何在内部处理 varchar 列 对于定义为的列char 100 DBMS 在磁盘上分配 100 个连续字节 但是 对于定义为的列varchar 100 情况可能并非如此 因为整个要点varchar是不分配比存储列中实际数据值所
  • WPF 从 ViewModel 打开一个新视图

    这是我的第一次WPF MVVM应用程序 这是我的结构 与我的一个项目app xaml打开应用程序并覆盖OnStartup来解析主窗口 我这样做是因为参考文献 我的观点的一个项目 我的 ViewModel 的一个项目 我的模特的一个项目 我有
  • 我不知道Python中的__iter__,谁能给我一个好的代码示例

    我的代码运行错误 class a object def iter self return 33 b a aaa b bbb c a print b itervalues print c itervalues 请尝试使用代码 而不是文本 因为
  • JavaScript 在 JSON 对象内搜索

    我的应用程序中有一个 JSON 字符串 对象 list name my Name id 12 type car owner name my Name2 id 13 type car owner2 name my Name4 id 14 ty
  • 将 PFQueryTableViewController (来自解析)与 Swift 结合使用

    我已将 UITableViewController 添加到故事板 并创建 分配一个从 PFQueryTableViewController 继承到故事板控制器的新类 然后我编写了以下初始化函数 但我无法使表视图控制器正常工作 为了实例化 P
  • 尝试使用 Discord.py 重写将消息发送到特定频道,但它不起作用

    我目前正在开发一个不和谐的机器人 我尝试在用户升级后使用 Discord py 重写将消息发送到特定频道 但我收到此错误 await channel message send f message author mention is now
  • 为什么构造函数中带有可选参数的类不能满足 new() 泛型约束?

    以下代码无法编译 产生 Widget 必须是具有公共无参数构造函数的非抽象类型 错误 我认为编译器拥有它需要的所有信息 这是一个错误吗 疏忽 或者是否存在某些情况下这无效 public class Factory
  • 如何连接 Wordpress 登录系统以编程方式阻止某些用户?

    我正在开发一个基于 WordPress 的门户网站 该门户网站与定制的电子商务集成 电子商务还充当 控制面板 所有角色都在那里设置 一些用户被记录但 不活跃 他们不应该能够登录 WordPress 出于这个原因 我需要连接到 Wordpre
  • 套接字心跳与保活

    为套接字实现自己的心跳和设置 keepalive 有何优缺点 我在某处读到 保活有时可能会失败 连接无论如何都会关闭 取决于网络结构 另一件事是 自己的心跳可以检测应用程序是否响应 不仅仅是套接字 我的主要目标是确保所有这些 即使没有发送数
  • 如何在 Android 中解压 7zip 存档?

    我有一个7zip包含数百个文件的存档 这些文件被分成不同的目录 目标是从 FTP 服务器下载它 然后将其解压到手机上 我的问题是7zipSDK包含的内容并不多 我正在寻找有关 7z 文件解压的示例 教程和片段 解压通过Intent只是次要选
  • npm 命令中 - 和 -- (单破折号和双破折号)之间的区别

    我想知道这个问题是否已经得到解决 我用过一些这样的命令 npm install g npm install d 然后我用了一些类似的 npm install XYZ save dev npm install only dev 之间的根本区别
  • 发现对集合 org.hibernate.HibernateException 的共享引用

    我收到此错误消息 错误 找到对集合的共享引用 Person latedPersons 当我尝试执行时addToRelatedPersons anotherPerson person addToRelatedPersons anotherPe
  • 我可以在没有 GUI 的情况下使用 OS X 10.8 的语音识别/听写功能吗?

    理想情况下 我想使用 Python 的 10 8 Mountain Lion 听写功能 而不需要 GUI 据我所知 目前仅支持听写UITextInput协议 这意味着 GUI 正确吗 您可以创建一个虚拟文本字段 并通过模拟按键以编程方式开始
  • 更改 Hadoop 中现有文件的块大小

    考虑一个 hadoop 集群 其中默认块大小为 64MBhdfs site xml 然而 后来团队决定将其更改为 128MB 这是我对上述场景的疑问 此更改是否需要重新启动集群 或者它会自动占用并且所有新文件将具有 128MB 的默认块大小
  • C/C++ 条件返回语句[重复]

    这个问题在这里已经有答案了 我正在研究嵌入式程序 在某些情况下 如果没有条件 我想尽快从函数返回 如果我有以下代码并且我正在进行嵌入式编程 foo if a lt b return 0 bail since condition is met
  • CoreData关系错误?

    我有一个与单位有 对多 关系的订单 当我尝试按顺序记录单位 NSSet 时 出现错误 NSFetchRequest fetchRequest NSFetchRequest alloc init NSEntityDescription ent
  • IBM Db2 中 if 存在的语法

    如果表存在但它似乎不适用于 IBM Db2 则以下查询将删除该表 Begin atomic if exists SELECT 1 FROM SYSIBM SYSTABLES WHERE NAME EMAIL AND TYPE T AND c
  • Socket.io 意外断开

    我有node js 服务和角度客户端 使用socket io 在长时间的http 请求期间传输一些消息 Service export const socketArray SocketIO Socket export let socketMa
  • Postgres 无法侦听特定 IP 地址

    我试图阻止对 PostgreSQL 的访问 只允许访问本地主机和我的机器外部 IP 例如 172 211 xx xx 此 IP 由我的 ISP 互联网服务提供商 提供 In postgresql conf我设置了以下行 listen add
  • GZIP解压 C# OutOfMemory

    我有许多从 ftp 下载的大型 gzip 文件 大约 10MB 200MB 需要解压 所以我尝试谷歌并找到一些gzip解压的解决方案 static byte Decompress byte gzip using GZipStream str