我需要通過SENDER_ID組Mnesia的記載,這裏是記錄:如何組通過Mnesia的返回由ID對象:match_object功能
-record(pm,{sender_id, recipient_id, msg, time}).
基本上我需要sender_id
獲取所有記錄,其中recipient_id=X
和他們組
什麼是最快的方法呢?
我認爲情況是顯而易見的。
我需要通過SENDER_ID組Mnesia的記載,這裏是記錄:如何組通過Mnesia的返回由ID對象:match_object功能
-record(pm,{sender_id, recipient_id, msg, time}).
基本上我需要sender_id
獲取所有記錄,其中recipient_id=X
和他們組
什麼是最快的方法呢?
我認爲情況是顯而易見的。
有幾種方法可以解決這個問題。
得到的結果和SENDER_ID
這是迄今爲止最簡單的解決方案對它們進行排序。剛剛得到的結果(記錄列表),你通常會和sort the records通過SENDER_ID:
lists:sort(fun(A, B) ->
A#pm.sender_id < B#pm.sender_id
end, Results).
使用QLC:摺疊/ 3
這是更復雜一點,但它似乎有點使用普通老lists:sort/2
更優雅。而不是返回一個列表它返回一個字典。
select_grouped_pms_for_recipient(RecipientId) ->
Q = qlc:q([E || E <- mnesia:table(pm), E#pm.recipient_id == RecipientId]),
qlc:fold(fun group/2, dict:new(), Q).
group(Record, Acc) ->
dict:append(Record#pm.sender_id, Record, Acc).
在group/2
函數我們推記錄到用於在dict
累加器發送者ID的值的列表。 select_grouped_pms_for_recipient/1
將返回結果dict
,其中包含在發件人ID密鑰下分組的所有記錄的列表。
Erlang郵件列表是一個好問題和答案的寶庫。我在郵件列表中找到this question,這與您的問題非常相似。
哪個更快?
看着這些解決方案,我不確定在性能上會有很大的差異。我想他們大致相同,但是對於每個接收到的項目,在執行所有分組邏輯的過程中,通過qlc保持鎖定,因此它可以將Mnesia鎖持續一段時間。
您使用的是什麼版本的Erlang? – Stratus3D