Haskell的内存中数据存储


9

我想在Haskell中为Web服务实现内存中的数据存储。我想在STMmonad中运行事务。

当我在Google 哈希表Steam Haskell上搜索时,我只会得到以下信息:Data. BTree. HashTable. STM.模块名称和复杂性表明这是作为树实现的。我认为对于可变哈希表,数组应该更有效。

是否有理由避免将数组用于STM哈希表?我可以通过此Steam哈希表获得任何收益,还是应该仅使用Steam ref来引用IntMap


请注意,如果您使用`TVar IntMap
Daniel Gratzer

@jozefg是什么意思?
西蒙·贝格

哦,对不起,显然我已经失去了其余的一切,我要说的是,您将获得糟糕的并行性,因为修改Store ! blah并且Store ! baz必须是连续的
Daniel Gratzer

当您说“内存中的数据存储”时,您是说酸状态吗?
Ptharien's Flame 2013年

@ Ptharien'sFlame我正在寻找比这更简单的东西。实际上,我正在寻找在stm monad中运行的简单可变映射。我知道我有几种选择,我正在尝试评估哪一种更好。
西蒙·贝格

Answers:


1

直接基于数组的哈希表实现的问题在于,对其进行的某些操作不可避免地需要线性调整时间数组的大小(即,创建更大或更小的数组并将所有数据复制到该数组)。有多种解决该问题的标准算法,例如线性哈希杜鹃哈希

不久前,出现了另一种称为哈希数组映射的Trie的算法,该算法由于支持持久性而在Clojure,Scala和Haskell(带有“无序容器”和“ hamtmap”库)等功能语言中获得了极大的欢迎。数据结构。

不久前,我发布了一个基于STM专用容器的库,该基于名为“ stm-containers”的算法,应该完全适合您的任务。您还可以查看介绍性博客文章,其中涵盖了图书馆背后的动机并提供了基准。


感谢回复!我没有测试过您的包裹,但看起来很有趣。稍后我会检查它,但是根据您的帖子,我准备相信它符合我的最初目标。
西蒙·贝格

1

您引用的实现是用于实现并发B树的软件包的一部分。HashTable本身实现为Data.Map对象的TVars数组。

引用的复杂度值是最坏的情况。请记住,对于查找,插入和删除,哈希表通常是O(N)最坏的情况。将Map用于存储桶可将其降至O(log(N))。

By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.