首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >如何在Haskell中进行惰性映射反序列化

如何在Haskell中进行惰性映射反序列化
EN

Stack Overflow用户
提问于 2014-10-25 08:27:25
回答 1查看 173关注 0票数 5

类似@Gabriel Gonzalez提出的这个问题:How to do fast data deserialization in Haskell

我有一个很大的Map,里面装满了整数和文本,我使用Cerial进行了序列化。文件大小约为10M。

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

当我只需要几个项目时,总是反序列化10万到100万个项目似乎是浪费。

我试过decodeLazy,也把地图改成了Data.Map.Lazy (我不太明白地图怎么会这么懒,但好吧,它就在那儿),这对时间没有影响,除了可能会慢一点。

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

更新

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

我想mmap可能会有帮助。第一次尝试了mmap库并对GHCI进行了分段故障。甚至不知道如何报告那个bug。

我尝试过bytestring-mmap库,它可以工作,但没有性能提升。只需替换这个:

代码语言:javascript
复制
ser <- BL.readFile cacheFile

有了这个:

代码语言:javascript
复制
ser <- unsafeMMapFile cacheFile

更新2

keyvaluehash可能就是合适的选择。性能看起来真的很好。但是API很奇怪,而且缺少文档,所以还需要一些实验。

更新3:我是个笨蛋

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

Keyvaluehash看起来是一个原生的Haskell键值数据库,我喜欢它,但我仍然不知道它的质量如何。例如,您不能要求数据库提供所有键或所有值的列表(唯一实际的操作是readKeywriteKeydeleteKey),因此如果需要,则必须将其存储在其他地方。另一个缺点是,您必须在创建数据库时告诉它一个大小。我使用了20M的大小,所以我有足够的空间,但它创建的实际数据库占用了266M。不知道为什么,因为没有一行文档。

EN

回答 1

Stack Overflow用户

发布于 2016-02-23 03:04:47

我以前做过的一种方法是创建一个目录,其中每个文件都由一个序列化的键命名。可以使用unsafeinterleaveIO来“推送”每个读取文件的反序列化内容,以便仅在读取时强制取值……

票数 1
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/26558117

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档