2011-01-25 14 views
4

私はETSを使用しています - 素晴らしい作品です。しかし、私はルートデータのキャッシュとして使用します。これは、モジュールがロードされたときにロードし、変更が行われたときに保存します(書き込まれたデータよりはるかに読み込まれます)。ほとんどがDETSの読み取り専用です

私はDETSがもっとクリーンなものになると考えていました。テーブルの永続性を管理することについて心配する必要はありません。これはDETSの有効な使用ですか? (サイズは問題ではなく、主に読み取りパフォーマンスの大幅な向上を懸念しています。すべてのデータがメモリに簡単に収まるようになっています)。ストレートDets man pageから

答えて

4

ほとんどの場合、DETSはETSよりもはるかに低速ですが、データサイズが小さい場合、ディスクキャッシュによってキャッシュされ、2度目の読み込みを高速に実行できる場合は、あなたのタイプのものを試してみてください

しかし、ETSの代わりにMnesiaを直接使用することを検討しましたか? Mnesiaテーブルタイプのdisc_copiesでは、ETSのスピードと永続性を得ることができます。

+0

ありがとう、私はそれを検討します。私は本当に必要になるまで依存関係を避けようとしていますが、私は本当に多くの記憶主義を必要としませんが、おそらくそれを信頼するよりも、 –

2

「DETSによって実行されるすべての操作は、ディスク操作なので、単一のルックアップ操作は、シーク動作およびディスク読み取りのシリーズを伴うことを認識することが重要である。このため。理由は、Dets関数は対応するEts関数よりもはるかに遅いですが、Detsは同様のインタフェースをエクスポートします。

つまり、読み取り専用のストレージでは、Detsは最適な選択ではありません。

(私はこのデザインの決定が奇妙であることを認めなければなりません - 最近のルックアップはより良い実装でキャッシュされるべきですが、EtsとDetsはErlangの基本的な機能であるため、実装者はその最適化をユーザに任せました)。

+1

覚えておくべきことは、ETSもDETSもデータベースではなく、データストアだと思います。より複雑な動作をさせるためには、Mnesiaのような適切なデータベースアプリケーションでそれらを使用する必要があります。 – rvirding

+0

私はEtsやDetsがデータベースだと書いたことはありません。 –

+1

DETSはキャッシングが取り除かれている低レベルのシステムです。 ETSとDETSを組み合わせると、このようなキャッシング・レイヤーを自分で作成するのはかなり簡単ですが、キャッシュ・レクラメーションの良い戦略は何ですか?そのような選択肢はユーザーに任せておく方がよいでしょう。 –

0

まれに、あなたが記憶している大量のデータを読み、「Mochiglobal」をチェックしてください。 Mochiwebには、Erlangのモジュール定数共有ヒープをコード管理システム経由で悪用して、オンザフライで定数として与えられた値を持つモジュールを生成することで、用語に超高速アクセスを提供するきちんとしたモジュールがあります。

Riakはリング状態IIRCにMochiglobalを使用します。

ハーズはソースです:

https://github.com/mochi/mochiweb/blob/master/src/mochiglobal.erl

もちろん、ここでは絶対にない持続性はありませんが、あなたは多額の読み込みを最適化するために探しているなら、あなたはこれよりはるかに良くなることはできません。

関連する問題