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

C# Compressing a lot of data blocks fast/efficiently(C#快速高效地压缩大量数据块)
本文介绍了C#快速高效地压缩大量数据块的处理方法,对大家解决问题具有一定的参考价值,需要的朋友们下面随着小编来一起学习吧!

问题描述

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

当我将它们保存到一个文件时,我当然会得到一个非常大的文件。 但数据很容易压缩。
用WinRAR对5.48GiB文件进行强压缩后,得到的文件大小为37.4MiB。

但我需要随机访问每个单独的块,因此我只能单独压缩这些块。
为此,我使用了.NET提供的Deflate类,它将文件大小减少到382MiB(我可以接受)。
但是速度还不够好。 很大一部分速度损失可能是因为总是为每个块创建一个新的内存流和Deflate实例。 但它们似乎并不是为了重复使用而设计的。

我猜(多吗?)如果使用"全局"字典,而不是为每个块使用一个字典,则可以实现更好的压缩。

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

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

长篇短篇故事: 类型1主要由1组成。 类型2主要由0和1组成 类型3主要由零组成 尚未出现大于128的值。

16KiB数据块几乎总是由零组成

推荐答案

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

随机评论:"……很多速度损失可能是……"不是解决性能问题的方法。衡量一下,看看是否真的是这样。

这篇关于C#快速高效地压缩大量数据块的文章就介绍到这了,希望我们推荐的答案对大家有所帮助,也希望大家多多支持编程学习网!

本站部分内容来源互联网,如果有图片或者内容侵犯您的权益请联系我们删除!

相关文档推荐

DispatcherQueue null when trying to update Ui property in ViewModel(尝试更新ViewModel中的Ui属性时DispatcherQueue为空)
Drawing over all windows on multiple monitors(在多个监视器上绘制所有窗口)
Programmatically show the desktop(以编程方式显示桌面)
c# Generic Setlt;Tgt; implementation to access objects by type(按类型访问对象的C#泛型集实现)
InvalidOperationException When using Context Injection in ASP.Net Core(在ASP.NET核心中使用上下文注入时发生InvalidOperationException)
LINQ many-to-many relationship, how to write a correct WHERE clause?(LINQ多对多关系,如何写一个正确的WHERE子句?)