Mnesia 分页 table
Mnesia pagination with fragmented table
我有一个失忆症 table 配置如下:
-record(space, {id, t, s, a, l}).
mnesia:create_table(space, [ {disc_only_copies, nodes()},
{frag_properties, [ {n_fragments, 400}, {n_disc_copies, 1}]},
{attributes, record_info(fields, space)}]),
我至少有 400 万条记录用于测试 table。
我已经实现了这样的东西
fetch_paged() ->
MatchSpec = {'_',[],['$_']},
{Record, Continuation} = mnesia:activity(async_dirty, fun mnesia:select/4, [space, [MatchSpec], 10000, read], mnesia_frag).
next_page(Cont) ->
mnesia:activity(async_dirty, fun() -> mnesia:select(Cont) end, mnesia_frag).
当我执行分页方法时,它会带来 3000 到 8000 之间的批处理,但永远不会达到 10000。
我需要做什么才能始终如一地为我带来批次?
问题是您期望失忆症:select/4,记录为:
select(Tab, MatchSpec, NObjects, Lock) -> transaction abort | {[Object],Cont} | '$end_of_table'
让您达到 NObjects 限制,在您的示例中为 NObjects 10,000。
但是同一份文档还说:
For efficiency the NObjects is a recommendation only and the result may contain anything from an empty list to all available results.
这就是您无法获得 10,000 条记录的一致批次的原因,因为 NObjects 不是限制而是建议的批次大小。
如果你想获得 10,000 条记录,除了编写你自己的函数之外没有其他选择,但是 select/4 以这种方式编写是为了优化目的,所以很可能你将使用的代码写出来会比原来的代码慢
顺便说一句,您可以在 https://github.com/erlang/otp/tree/master/lib/mnesia/src
上找到 mnesia 源代码
我有一个失忆症 table 配置如下:
-record(space, {id, t, s, a, l}).
mnesia:create_table(space, [ {disc_only_copies, nodes()},
{frag_properties, [ {n_fragments, 400}, {n_disc_copies, 1}]},
{attributes, record_info(fields, space)}]),
我至少有 400 万条记录用于测试 table。
我已经实现了这样的东西
fetch_paged() ->
MatchSpec = {'_',[],['$_']},
{Record, Continuation} = mnesia:activity(async_dirty, fun mnesia:select/4, [space, [MatchSpec], 10000, read], mnesia_frag).
next_page(Cont) ->
mnesia:activity(async_dirty, fun() -> mnesia:select(Cont) end, mnesia_frag).
当我执行分页方法时,它会带来 3000 到 8000 之间的批处理,但永远不会达到 10000。
我需要做什么才能始终如一地为我带来批次?
问题是您期望失忆症:select/4,记录为:
select(Tab, MatchSpec, NObjects, Lock) -> transaction abort | {[Object],Cont} | '$end_of_table'
让您达到 NObjects 限制,在您的示例中为 NObjects 10,000。
但是同一份文档还说:
For efficiency the NObjects is a recommendation only and the result may contain anything from an empty list to all available results.
这就是您无法获得 10,000 条记录的一致批次的原因,因为 NObjects 不是限制而是建议的批次大小。
如果你想获得 10,000 条记录,除了编写你自己的函数之外没有其他选择,但是 select/4 以这种方式编写是为了优化目的,所以很可能你将使用的代码写出来会比原来的代码慢
顺便说一句,您可以在 https://github.com/erlang/otp/tree/master/lib/mnesia/src
上找到 mnesia 源代码