C#快速/高效地压缩大量数据 block

标签 c# compression block

我有大约 270k 数据 block 对,每一对由一个 32KiB 和一个 16KiB block 组成。

当我将它们保存到一个文件时,我当然会得到一个非常大的文件。 但是数据很容易被压缩。
使用 WinRAR 压缩 5.48GiB 文件后,经过强力压缩,生成的文件大小为 37.4MiB。

但我需要随机访问每个单独的 block ,所以我只能单独压缩 block 。
为此,我使用了 .NET 提供的 Deflate 类,它将文件大小减小到 382MiB(我可以接受)。
但是速度不够好。

很多速度损失可能是由于总是为每个 block 创建一个新的 MemoryStream 和 Deflate 实例。 但它们似乎不是为重复使用而设计的。

我想(很多?)当使用“全局”字典而不是每个 block 都有一个字典时,可以实现更好的压缩。

是否有适合该任务的压缩算法的实现(最好在 C# 中)?

以下链接包含每个字节数出现的百分比,分为三种 block 类型(仅限 32KiB block )。 第一和第三 block 类型的出现率为 37.5%,第二个为 25%。 Block type percentages

长篇短篇小说: Type1 主要由一个组成。 Type2 主要由零和一组成 Type3 主要由零组成 大于 128 的值(尚未)出现。

16KiB block 几乎总是由零组成

最佳答案

如果您想尝试不同的压缩,您可以从适合您的数据的 RLE 开始 - http://en.wikipedia.org/wiki/Run-length_encoding - 即使在最简单的实现中,它也会非常快。相关http://en.wikipedia.org/wiki/Category:Lossless_compression_algorithms包含更多链接以开始其他算法,如果你想自己动手或找到别人的实现。

随机评论:“......很多速度损失可能是......”不是解决性能问题的方法。测量一下,看看是不是真的。

关于C#快速/高效地压缩大量数据 block ,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/8191965/

相关文章:

algorithm - 按准对数标度压缩

graphics - 能否在不损失质量的情况下旋转 JPEG 压缩图像?

c# - 将 bool[] 增长为位(特定线性方式!= >> || <<)

c# - Dns.GetHostEntry 返回多个 IP 地址

C# 使用约束泛型仅允许在父类型上运行函数

php - 你如何缩小和/或压缩 php 文件中的 JavaScript?

c - block 模式下的读取中断

java - java中有 'block until condition becomes true'函数吗?

c# - Azure 服务总线 ReceiveBatch 返回 0 条消息