表示二进制数据的集合

时间:2017-06-12 08:26:13

标签: performance haskell memory optimization

我正在处理样本由Float组成的信号。我编写的一些算法只需要知道信号何时穿过x轴(即正值到负值,反之亦然)。当我进行这些操作时,我意识到我不需要知道每个样本的实际Float值。我只需要知道样本的值是否为正值。

我最初将信号表示为Vector的{​​{1}}。在我发现之后,我开始将其表示为Float Vector个值(即Boolean表示负值,False表示正值。结果证明效率更高,我在运行时和内存消耗方面都提高了程序的性能。

我仍然想知道是否没有更有效的方式来表示这个“二进制数据集合”。像TrueBit Vector这样的东西。我在Hackage上找到了BitArray,但它似乎不支持Bit Array所具有的相同功能。

是否有更有效的方式来表示我的用例数据,还是应该坚持Vector Vector个值?

1 个答案:

答案 0 :(得分:1)

vectorarray软件包分别提供每个字节一个bool和每个一个bool的选项。

首先,来自Vector Bool的{​​{1}}使用每Data.Vector.Unboxed个字节的字节数组。这可以从模块Bool中的来源进行验证,其中Data.Vector.Unboxed.Base定义为:

Vector Bool

获取和设置是通过函数调解的:

newtype instance Vector    Bool = V_Bool  (P.Vector    Word8)

或者,可以通过分析程序直接验证:

fromBool :: Bool -> Word8
toBool :: Word8 -> Bool

并观察它分配的超过1,000,000,000个字节。

其次,来自import Data.Vector.Unboxed as V main = let v = V.replicate 1000000000 True in print (v ! 5) 的{​​{1}}被实现为位向量,每位有一个UArray Int Bool。相关源位于Data.Array.Unboxed,您可以在其中查看实例中使用的位操作:

Bool

同样,这可以通过分析直接验证:

Data.Array.Base

并验证它分配大约125,000,000个字节。