Haskellのインメモリデータストア


9

HaskellのWebサービスにインメモリデータストアを実装したい。STMモナドでトランザクションを実行したい。

Haskellを使ってハッシュテーブルをスチームググリングすると、これしか得られませんData. BTree. HashTable. STM.。モジュール名と複雑さから、これはツリーとして実装されていることがわかります。可変ハッシュテーブルの場合、配列の方が効率的であると思います。

STMハッシュテーブルに配列を使用しない理由はありますか?このスチームハッシュテーブルで何かを得ますか、IntMapそれともスチームリファレンスを使用するだけですか?


注: `TVar IntMap
Daniel

@jozefgどういう意味ですか?
Simon Bergot 2013

申し訳ありませんが、明らかに残りの部分を失いました。変更するとシーケンシャルでなければならないためStore ! blah、並列処理が不安定にStore ! bazなると私は言っていました
Daniel Gratzer 2013

「インメモリデータストア」とは、酸の状態のようなものですか。
Ptharienの炎2013

@ Ptharien'sFlame私はそれよりももっとシンプルなものを探しています。実際、私はstmモナドで実行される簡単な可変マップを探しています。これにはいくつかの選択肢があることはわかっています。どちらが良いかを評価しようとしています。
Simon Bergot 2013

回答:


1

配列に直接基づくハッシュテーブル実装の問題は、その操作の一部で必然的に線形時間配列のサイズ変更が必要になることです(つまり、大きい/小さい配列を作成し、すべてのデータを配列にコピーする)。この問題に対処する標準的なアルゴリズムには、線形ハッシュカッコウハッシュなど、複数あります。

少し前に、Hash Array Mapped Trieという名前の別のアルゴリズムが登場しました。これは、永続性のサポートにより、Clojure、Scala、そしてもちろんHaskell(「unordered-containers」と「hamtmap」ライブラリを含む)などの関数型言語で大きな人気を得ました。データ構造。

少し前に「stm-containers」という名前のアルゴリズムに基づくSTM専用のコンテナーライブラリをリリースしまし。これは、タスクに完全に適合するはずです。また、ライブラリの背後にある動機をカバーし、ベンチマークを提供する紹介ブログ投稿をチェックすることもできます。


返信いただきありがとうございます!私はあなたのパッケージをテストしていませんが、興味深いようです。後で確認しますが、あなたの投稿に基づいて、それが私の最初の目標に合うと信じる準備ができています。
Simon Bergot

1

参照する実装は、並行Bツリーを実装するためのパッケージの一部です。HashTable自体は、Data.MapオブジェクトのTVarの配列として実装されます。

引用された複雑さの値は最悪の場合です。ハッシュテーブルは通常、検索、挿入、および削除においてO(N)の最悪のケースであることを覚えておいてください。バケットにMapを使用すると、O(log(N))になります。

弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.