类似@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库,它可以工作,但没有性能提升。只需替换这个:
ser <- BL.readFile cacheFile有了这个:
ser <- unsafeMMapFile cacheFile更新2
keyvaluehash可能就是合适的选择。性能看起来真的很好。但是API很奇怪,而且缺少文档,所以还需要一些实验。
更新3:我是个笨蛋
显然,我在这里想要的不是更懒惰的Map反序列化。我想要一个键值数据库,有几个选项可供选择,比如dvm、tokyo-cabinet和这个我以前从未见过的levelDB。
Keyvaluehash看起来是一个原生的Haskell键值数据库,我喜欢它,但我仍然不知道它的质量如何。例如,您不能要求数据库提供所有键或所有值的列表(唯一实际的操作是readKey、writeKey和deleteKey),因此如果需要,则必须将其存储在其他地方。另一个缺点是,您必须在创建数据库时告诉它一个大小。我使用了20M的大小,所以我有足够的空间,但它创建的实际数据库占用了266M。不知道为什么,因为没有一行文档。
发布于 2016-02-23 03:04:47
我以前做过的一种方法是创建一个目录,其中每个文件都由一个序列化的键命名。可以使用unsafeinterleaveIO来“推送”每个读取文件的反序列化内容,以便仅在读取时强制取值……
https://stackoverflow.com/questions/26558117
复制相似问题