N + 1行目が追加された場合、1行目が削除される固定数の行(Nと言うことができます)のテーブルを作成します。Cassandra:テーブル内の行数を固定
これは表では、私はグラフの分析から、最後のN最良の結果を格納するために使用します。
CREATE TABLE IF NOT EXISTS lp_registry.best (
value float, // best value for current graph
verts int, // number of vertices in graph
edges int, // number of edges in graph
wid text, // worker id
id timeuuid, // timeuuid
PRIMARY KEY (wid, id)
) WITH CLUSTERING ORDER BY (id ASC);
私は約expiring data at DataStaxを読んで、唯一のTTLの有効期限を見つけました。だから私はそれを次のようにすることに決めました。
マイアプローチA:
が毎回新しい結果が
SELECT wid, id FROM lp_registry.best LIMIT 1;
..asならびに行の現在の数..最も古い行のIDが取得され、追加させたいです..
SELECT COUNT(*) FROM FROM lp_registry.best;
カウント> = Nならばその結果、最も古い行が削除され、最新のが追加され...
BEGIN BATCH
INSERT INTO lp_registry.best (value, verts, edges, wid, id) VALUES (?, ?, ?, ? now());
DELETE FROM lp_registry.best WHERE wid = ? AND id = ?;
APPLY BATCH;
このアプローチでは、最初の選択が次のバッチと共にアトミックな操作ではないという問題があります。したがって、他のワーカーが選択とバッチの間で最も古い行を削除した場合、またはNを超えた場合、これは機能しません。
私のアプローチB:このアプローチでは
同じ最初のステップ...その後
SELECT wid, id FROM lp_registry.best LIMIT 1;
SELECT COUNT(*) FROM FROM lp_registry.best;
成功するまで何度も何度も最も古い行を削除しようとする...
if count < N {
INSERT INTO lp_registry.best (value, verts, edges, wid, id) VALUES (?, ?, ?, ? now());
} else {
while not success {
DELETE FROM lp_registry.best WHERE wid = ? AND id = ? IF EXISTS;
}
INSERT INTO lp_registry.best (value, verts, edges, wid, id) VALUES (?, ?, ?, ? now());
}
カウントNがチェックされる前に、データベース内のNを超過してもまだ問題があります。
正しい解決策を教えてもらえますか?
簡単な質問の1つ:なぜこれが必要ですか?たぶん、あなたのユースケースにとっては、他のアプローチが良い選択肢かもしれません。 –
多くの並列計算機(労働者)は、それぞれ異なるデータに対して同じタイプの計算を実行し、計算時間は大きく異なります。そして、N個の最新の結果を取り、それを使って計算を実行するトップレベルのロジックがあります。 – Michal