4

だから私はETSを使ってきました - うまくいきます。ただし、ルート データのキャッシュとして使用します。これは、モジュールのロード時にロードし、変更が行われたときに保存します (書き込みよりも読み取りの方がはるかに多い)。

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

4

3 に答える 3

4

ほとんどの場合、DETS は ETS よりもはるかに低速ですが、データ サイズが小さい場合は、ディスク キャッシュによってキャッシュされ、2 回目に読み取ったときに取得するのが高速になると思います。用途に合わせてお試しください

しかし、ETS の代わりに Mnesia を直接使用することを考えたことはありますか? Mnesia テーブル タイプの disk_copies を使用すると、ETS の速度と持続性を得ることができます

于 2011-01-25T09:33:14.873 に答える
2

Detsの man ページから直接:

「Dets によって実行されるすべての操作はディスク操作であるため、1 回のルックアップ操作には一連のディスク シークおよび読み取り操作が含まれることを認識することが重要です。このため、Dets 関数は対応する Ets 関数よりもはるかに低速ですが、 Dets は同様のインターフェイスをエクスポートします。」

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

(この設計上の決定は奇妙だと認めざるを得ません。より良い実装では、最近のルックアップをキャッシュする必要があります。しかし、Ets と Dets は Erlang の基本的な機能であるため、実装者はその最適化をユーザーに任せたと思います。)

于 2011-01-25T08:44:57.857 に答える
0

めったに書き込まない、メモリに保持しても問題ない多くのデータを読み取る場合は、「Mochiglobal」をチェックしてください。Mochiweb には、コード管理システムを介してモジュール定数用の Erlang の共有ヒープを悪用し、その場で定数として与えられた値を持つモジュールを生成することにより、用語への超高速アクセスを提供するきちんとしたモジュールがあります。

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

彼女のソース:

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

もちろん、ここには永続性はまったくありませんが、読み取りを大幅に最適化することを検討している場合、これよりもはるかに優れたものはありません.

于 2011-01-26T03:09:15.427 に答える