【问题标题】:Determining the best initial buffer size for decompressing streamed compressed data确定解压缩流压缩数据的最佳初始缓冲区大小
【发布时间】:2010-11-02 04:56:21
【问题描述】:

我正在尝试计算解压缩未知大小数据时使用的初始缓冲区大小。我有一堆来自现有压缩流的数据点,但不知道分析它们的最佳方法。

数据点是压缩后的大小和与未压缩大小的比率。 例如: 100425(压缩大小)x 1.3413(压缩比)= 134,700(未压缩大小)

压缩的数据流不存储未压缩的大小,因此解压缩器必须分配初始缓冲区大小并在溢出时重新分配。在给定压缩大小的情况下,我将寻找“最佳”初始大小来分配缓冲区。我有超过 293,000 个数据点。

【问题讨论】:

  • “最佳”根据什么目标?你想最小化或最大化什么?
  • 2 个目标,避免初始缓冲区大小过大,并避免由于缓冲区不够大而导致过多的重新分配。我的压缩数据流从
  • 您有关压缩率的统计数据将非常不正确,因为您的输入(预压缩)数据范围太大。尝试将您的样本分成几个范围,比如说一个从 0-10,000 字节,另一个从 10,001 到 1,000,000 字节,另一个从 1,000,001 到 10,000,000 字节等。然后您将获得更好的中位数和标准差。

标签: algorithm math compression statistics


【解决方案1】:

鉴于您有很多关于压缩工作方式的数据点,我建议您分析压缩数据,以获得平均压缩标准和标准偏差。然后,我建议您最初将缓冲区大小设置为原始大小 * 您的压缩大小比平均值高 2 个标准差;这意味着您的缓冲区大小适合 93% 的案例。如果您希望缓冲区在更多情况下不需要重新分配,请将标准差的数量增加到您分配的平均值之上。

【讨论】:

  • 您好,感谢您的快速回复。您是否建议我应该计算压缩数据大小、比率或未压缩数据大小的平均值和标准差?不确定“原始大小 * 您的压缩大小”是什么意思?你所说的“你的压缩大小”是什么意思?
  • 另外,我应该在计算平均值和标准差之前删除重复项吗?
  • 我建议在实施之前阅读统计信息,但不,不要删除重复项;它们是计算频率时的重要数据点。并且您想要计算您的平均压缩比(平均值)和该压缩比的标准偏差(标准偏差)。所以假设你的平均压缩比是(比方说)1.5,你的标准差是(比方说)0.1;如果您假设压缩比为 1.7 (1.5 + 2 * 0.1),那么您将覆盖 93% 的案例(因为您覆盖了高于平均值的 2 个 stddev)。
  • 我已经尝试了几种方法来分割样本数据。但是我仍然得到奇怪的结果。例如,如果我只看 0..100,000 字节的压缩大小,则比率平均值为 1.2214,stddev 116.4742,使用您的计算的初始缓冲区比率将为 234.1698
  • 我怀疑您计算 stddev 的方式在某种程度上是错误的。事实上,有了这些数字,我几乎可以肯定。
【解决方案2】:

一种简单的方法是使用一个通用的初始解压缓冲区大小,并在每个重新分配时将大小加倍。这也用于许多动态库中。

【讨论】:

  • 我不能这样做,因为一些压缩流的大小超过 500MB
  • 我认为您必须考虑所有流的峰值内存使用量,而不是所需的平均内存。如果您只使用一个解压缩缓冲区,那么无论如何您都必须拥有该内存。使用了什么压缩库?
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2023-03-16
  • 2011-01-07
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多