2011-11-03 27 views
1

我保留{Key, Value}數據在ETS ordered_set其中Key是日期時間。在內部[From, To]的給定時間內選擇所有項目非常容易。ETS ordered_set和有效分頁

類似的東西:

ets:select(Tab, [{{'$1', '$2'}, [{'>=', '$1', From}, {'=<', '$1', To}], ['$2']}]) 

我們Limit參數select()功能,使我們能夠限制一些項目被選中。但是我怎樣才能指定一個偏移?

作爲輸入,我的模塊接收時間間隔和頁碼。我的目標是按指定的時間間隔和頁面返回項目。頁面大小(Limit)是一個常量。我可以計算偏移量爲

Offset = Limit * PageNumber - Limit 

問題是如何纔能有效地爲給定頁面選擇項目?

我知道select()功能可以收到Continuation參數,但是我從前面的選擇中沒有任何狀態。我只有一個頁碼。

可能,我必須使用其他數據結構。請推薦更好的解決方案。

回答

0

即使您的第一個選擇不是有效的,因爲ets匹配不夠聰明。按照這個discussion

+0

是否有任何替代數據結構在O(logN)中做這樣的選擇?也許gb_trees? – Stas

+0

@Stas:如果您將使用'next' +'lookup'羅伯特的建議,您將以與任何其他O(logN)結構相同的結果結束。唯一的缺點是您需要在頁面上存儲最後一個鍵以進一步移動。 –

+0

@Stas:'ordered_set'是O(log N),與gb_trees一樣。 Gb_trees允許您跨過桌面,但只能從開始處開始。你的桌子有多大?這將決定哪些數據結構對您來說是實用的。 – rvirding