ETS テーブル内のすべてのタプルに関数を適用したいと思います。
テーブルはセットで、各キーは 1 回だけ表示されます。
私のテーブルには、同じタイプのタプルのみが含まれています。
{Key, X, Y, VX, VY}
すべての値は::integer()
私がしたいのは、特定の値を経過させ、すべてのタプルを関数で更新することですapply_vector/2
apply_vector({K, X, Y, 0, 0}, _Elapsed) ->
{K, X, Y, 0, 0};
apply_vector({K, X, Y, VX, VY}, Elapsed) ->
NewX = X + (VX * Elapsed),
NewY = Y + (VY * Elapsed),
{K, NewX, NewY, VX, VY}.
可能な解決策
を使用する
ets:foldl
と、折りたたみ中に挿入がトラバースされ、無限 (非常に長い) ループが発生する可能性があります。を使用して新しいタプルを準備し、
ets:foldl
リスト全体を挿入できます。新しいテーブルに挿入して、古いテーブルを新しいテーブルに置き換えることはできますが、テーブルへのアクセスを gen_server への呼び出しで制限したくありません。テーブルにはいつでもアクセスできる必要があります。
ets:update_element
XとYを更新するためにVXとVYの値を読む必要があるので使えません。いくつかの反復子ユーティリティがあることは知っていますが、楽しみを渡すことを誰も許可していないようです。
この更新は 1 ~ 5 秒ごとに行う必要があります。では、10個のタプルで最も効率的なソリューションはどれですか? 100個のタプルで?もっと?
ありがとう !
ボートのリストを保持します。キーはボート ID、X と Y は地理座標、VX と VY は動きのベクトル (1 秒間の変位) を表します。Elapsed は比率であり、最後の更新からの秒数です。テーブルは、各ボートの位置をいつでも知るのに役立ちます。