【问题标题】:Correct way to store a bit array存储位数组的正确方法
【发布时间】:2014-02-25 02:34:03
【问题描述】:

我正在做一个需要存储类似

的项目
 101110101010100011010101001

进入数据库。它不是文件或存档:它只是一个位数组,我认为将其存储到 varchar 列中是浪费空间/性能。

我搜索了 BLOB 和 VARBINARY 类型。但是两者都允许插入一个像 54563423523515453453 这样的值,这不完全是一个位数组。

当然,如果我将 10001000 之类的位数组存储到 BLOB/varbinary/varchar 列中,它将消耗超过一个字节,并且我希望消耗最少的空间。 8位的情况下只需要消耗1个字节,16位需要消耗2个字节,以此类推。

如果不可能,那么在这种情况下浪费最少空间的最佳方法是什么?

重要提示:数组的大小是可变的,并且在任何情况下都不能被 8 整除。有时我需要存储 325 位,有时需要存储 7143 位....

【问题讨论】:

    标签: mysql binary


    【解决方案1】:

    在我之前的一个项目中,我将 1 和 0 的流转换为十进制,但它们更短。我不知道这是否适用于您的项目。

    另一方面,恕我直言,您应该明确在存储这些数据后需要如何处理这些数据。搜索?相比?这可能很大程度上取决于数据库的用途。

    你能压缩它然后存储它吗?这适用吗?

    【讨论】:

    • 感谢您的回答。解释起来有点复杂,但在resume中,我的代码中有一个bool[],我只想存储,之后,按原样选择它。
    • 如果只关心存储空间,您可能应该使用某种压缩方法并将其压缩存储,恕我直言
    【解决方案2】:

    二进制是数字的字符串表示形式。字符串

    101110101010100011010101001
    

    代表数字

    ... + 1*2<sup>5</sup> + 0*2<sup>4</sup> + 1*2<sup>3</sup> + 0*2<sup>2</sup> + 0*2<sup>1</sup> + 1*2<sup>0</sup>

    因此,如果要从二进制字符串转换为它所代表的数字,它可以存储在 32 位整数中。在 Perl 中,可以使用

    oct('0b'.$binary)
    

    但是您的位数是可变的。不是问题!只需一次处理 8 个字节以创建一串字节以放置在 BLOB 或类似文件中。

    啊,但有一个问题。您需要添加填充以获得可被 8 整除的数字,这意味着您必须使用一种方法来删除该填充。如果存在已知的最大长度,一种简单的方法是使用长度前缀。例如如果您知道位数永远不会超过 65,535,请对字符串的前两个字节中的位数进行编码。

    pack('nB*', length($binary), $binary)
    

    使用恢复的

    my ($length, $binary) = unpacked('nB*', $packed);
    substr($binary, $length) = '';
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2013-05-08
      • 2023-03-31
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多