2016-07-28 6 views
3

ErlangでLRUキャッシュを実装する方法は?トップはGitHubのプロジェクト主演Erlang LRUキャッシュ

LRU Cache Wiki

fogfish/cacheだったが、セグメント化されたテーブルには、私のデータのために非常に適合しませんでした。

barrel-db/erlang-lruはリストを使用していました。テスト後、データが多すぎると処理が遅くなります。

ここに問題があったと思います。

move_front(List, Key) -> [Key | lists:delete(Key, List)].

のJavaでは、より高度な実装では、私はLinkedListのは良いアイデアではなかったことに気づき、その後のLinkedListを実行しようとしました、そしてlike this

ハッシュマップのLinkedListを使用していましたErlanglike this threadの場合

ErlangでLRUキャッシュを実行する方法は?

+0

を実装する必要があります私はErlangのは、低レベルのキャッシュを行うには高すぎるレベルであり、現在、Erlangのは、(コアにいくつかの類似した特徴を持っていると思いますETS http://erlang.org/doc/man/ets.html)のように、外部プロジェクトを使用する前にいくつかの機能をテストしましたか? @マシューK。 –

+0

コメントありがとうございます。はい、試しました。重要な問題はLRUです。私はaccess_timeを保存するためにテーブルを使用しようとしましたが、すべての読み取り/更新でテーブルを更新(削除してから挿入)する必要があります。これがもっと良い方法でできるのだろうか? – user3644708

+0

あなたの質問に1つの答えがありません。 Erlangで実行可能なLRUキャッシュを実装したい場合は、[ports](http://erlang.org/doc/reference_manual/ports.html)または[NIF]で相互接続された外部コードを使用することをお勧めしますhttp://erlang.org/doc/tutorial/nif.html)。 Cプログラミングは私のお気に入りのドメインではありませんが、ErlangのCコードを実装する例が必要な場合は、[ビームソースコード](https://github.com/erlang/otp/tree/maint/erts/)をチェックしてくださいエミュレータ/ビーム)。 –

答えて

1

THE CACHEの最初の実装は、2つのインデックスを持つETSに基づいていました。 1つのetsテーブルが保持されているTTL -> Keyの関係、別のetsテーブルはKey -> Objectです。あなたは

https://github.com/fogfish/cache/commit/8cc50bffb4178ad9ad716703507c3290e1f94821

での実装を見ることができる2つのインデックスのメンテナンスが効率的なので、セグメント化されたキャッシュアウトパフォーム元の実装ではありませんでした。アクター内でデータをモデル化し、オーバーヘッドを受け入れることができない限り、Erlangデータ構造を使ってオブジェクトごとのTTLを実装することはお勧めしません。それに対処する実装があります。これは、オブジェクトの概念ごとにプロセスを使用している:

https://github.com/fogfish/pts

そうでない場合、あなたはNIF

関連する問題