1

etsテーブルを状態として保持したいgen_serverを作成していますが、etsテーブルは別の場所に作成されています。これをgen_serverの状態に追加するにはどうすればよいですか?

メモリを節約したいので、新しいディクショナリを作成するのではなく、etsテーブルを使用したいと思います。

また、etsテーブルをどのように反復しますか?テーブル内の各値を反復または読み取り、値を確認してから、値に応じて2つのオプションのいずれかを実行します。

etsテーブルをリストに変えてリストをトラバースするだけの方が簡単でしょうか?

ありがとう

4

1 に答える 1

4

いくつかの提案:

  • ETSのマニュアルページを読んでください。erl -man ets
  • ETSテーブルは、その名前(named_tableオプションの場合)またはテーブルIDのいずれかによって識別されます。その情報をgen_serverに渡し、次の状態に保ちます。

    -record(state, { ..., tbl = none }).
    
    
    init([TableID]) ->
        ...,
        {ok, #state { tbl = TableID }}.
    

ETSはおそらくそれほど多くのメモリを節約しません。後のErlang/OTPリリースで新しいフラグが出てきて、ETSテーブルcompressedの内容を保存前に圧縮し、読み取り時に非圧縮にすることができます(これには計算上のオーバーヘッドがあります)。

ETSテーブルを反復処理するには、いくつかのオプションがあります。ets:first/1 ets:next/2そのようなインターフェースの1つです。ets:foldl/3 ets:foldr/3別。ets:match/3歩き続けるための継続(カーソル)を提供します。ets:select一致よりもさらに一般的です。

それをリストに変換する方が簡単でしょうか?これは状況によって異なります。{keypos, N}ETSテーブルの利点は、要素が格納されるキーを定義するオプションがあることです。ets:lookup(?TAB, Key)は非常に高速であるため、キーをすばやく検索できます。リストではそうではありません。ただし、一方で、常にすべてのリストをトラバースする場合は、より簡単な解決策になる可能性があります(プロセス間で大きなリストを渡さない限り)。

テーブル全体をリストに変換してトラバースすることは、おそらく避ける必要があります。リストをメモリに生成してから、それをトラバースしますが、これはコストがかかります。ライブメモリの量が少なくなるように、一度に少しずつトラバースする方がはるかに優れています。

于 2010-11-24T19:43:27.783 に答える