いくつかの提案:
- 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)
は非常に高速であるため、キーをすばやく検索できます。リストではそうではありません。ただし、一方で、常にすべてのリストをトラバースする場合は、より簡単な解決策になる可能性があります(プロセス間で大きなリストを渡さない限り)。
テーブル全体をリストに変換してトラバースすることは、おそらく避ける必要があります。リストをメモリに生成してから、それをトラバースしますが、これはコストがかかります。ライブメモリの量が少なくなるように、一度に少しずつトラバースする方がはるかに優れています。