【问题标题】:Mnesia pagination with fragmented table带有碎片表的 Mnesia 分页
【发布时间】:2015-08-26 10:08:27
【问题描述】:

我有一个 mnesia 表配置如下:

-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 万条记录用于测试。

我已经实现了类似Pagination search in Erlang Mnesia

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。

我必须怎么做才能始终如一地给我带来批次?

【问题讨论】:

    标签: pagination erlang mnesia


    【解决方案1】:

    问题是你期望 mnesia: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源代码

    【讨论】:

      猜你喜欢
      • 2015-12-21
      • 2019-06-04
      • 1970-01-01
      • 1970-01-01
      • 2020-04-10
      • 2017-12-09
      • 2011-01-10
      • 1970-01-01
      • 2015-06-17
      相关资源
      最近更新 更多