相关疑难解决方法(0)

将Haskell Word32/64中的IEEE 754浮点转换为Haskell Float/Double

题

在Haskell中,base库和Hackage包提供了几种将二进制IEEE-754浮点数据转换为提升Float和Double类型的方法.但是,这些方法的准确性,性能和可移植性尚不清楚.

对于旨在(跨)平台(反)序列化二进制格式的GHC目标库,处理IEEE-754浮点数据的最佳方法是什么?

途径

这些是我在现有库和在线资源中遇到的方法.

FFI Marshaling

这是data-binary-ieee754包使用的方法.因为Float,Double,Word32和Word64是的每个实例Storable中,一个能poke源类型的值到外部缓冲器,然后peek目标类型的一个值:

toFloat :: (F.Storable word, F.Storable float) => word -> float
toFloat word = F.unsafePerformIO $ F.alloca $ \buf -> do
    F.poke (F.castPtr buf) word
    F.peek buf
Run Code Online (Sandbox Code Playgroud)

在我的机器上这是有效的,但我畏缩看到分配只是为了完成强制.此外,虽然这个解决方案并不是唯一的,但这里隐含的假设是IEEE-754实际上是内存中的表示.包装附带的测试给它"在我的机器上工作"的批准印章,但这并不理想.

unsafeCoerce

使用内存中IEEE-754表示的相同隐含假设,以下代码也可以获得"在我的机器上工作"的封条:

toFloat :: Word32 -> Float
toFloat = unsafeCoerce
Run Code Online (Sandbox Code Playgroud)

这样做的好处是不像上面的方法那样执行显式分配,但是文档说"你有责任确保旧的和新的类型具有相同的内部表示".这个隐含的假设仍然在做所有的工作,在处理提升的类型时更加费劲.

unsafeCoerce#

扩展可能被视为"便携"的限制:

toFloat :: Word -> Float
toFloat (W# w) …
Run Code Online (Sandbox Code Playgroud)

floating-point haskell ghc ieee-754

38
推荐指数
4
解决办法
3790
查看次数

如何在Haskell中进行Lazy Map反序列化

与@Gabriel Gonzalez的这个问题类似:如何在Haskell中进行快速数据反序列化

我有一个很大的地图,里面有我使用Cerial序列化的整数和文本.该文件大约是10M.

每次我运行我的程序时,我都会对整个事件进行反序列化,这样我就可以查找一些项目了.反序列化需要大约500毫秒,这不是什么大问题,但我似乎总是喜欢周五的分析.

当我只需要一些项目时,总是将100k到100个项目反序列化似乎很浪费.

我尝试decodeLazy并将地图更改为Data.Map.Lazy(不太了解地图可以如何懒惰,但确定,它就在那里)并且这对时间没有影响,除非它可能有点慢.

我想知道是否有一些东西可以更聪明,只需加载和解码所需的东西.当然,像sqlite这样的数据库可能非常大,但它只加载完成查询所需的内容.我想找到类似的东西但不必创建数据库模式.

更新

你知道什么会很棒吗?一些Mongo与Sqlite的融合.就像你可以拥有一个使用平面文件存储的JSON文档数据库......当然有人在Ruby中做了它https://github.com/hamiltop/MongoLiteDB ... :(

思想mmap可能有所帮助.mmap第一次尝试了图书馆和隔离的GHCI.不知道怎么能报告那个bug.

尝试过的bytestring-mmap库,但有效,但没有性能提升.只是替换这个:

ser <- BL.readFile cacheFile
Run Code Online (Sandbox Code Playgroud)

有了这个:

ser <- unsafeMMapFile cacheFile
Run Code Online (Sandbox Code Playgroud)

更新2

keyvaluehash可能只是门票.表现似乎非常好.但API很奇怪,缺少文档,因此需要进行一些实验.

更新3:我是个白痴

显然,我想要的不是地图的更加懒惰的反序列化.我想要一个键值数据库,有几个选项可供选择,比如dvm,tokyo-cabinet和我以前从未见过的这个levelDB.

Keyvaluehash看起来是我喜欢的native-Haskell键值数据库,但我仍然不知道质量.例如,您不能向数据库询问所有键或所有值的列表(唯一的实际操作是readKey,writeKey和deleteKey),因此如果您需要,则必须将其存储在其他位置.另一个缺点是在创建数据库时必须告诉它一个大小.我使用了20M的大小,所以我有足够的空间,但它创建的实际数据库占用了266M.不知道为什么因为没有一行文档.

performance serialization haskell lazy-loading deserialization

5
推荐指数
1
解决办法
146
查看次数