我有一个配置如下的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.
我必须做些什么才能使我的产品始终如一?
答案 0 :(得分:1)
问题是你期望mnesia:select / 4,记录为:
select(Tab, MatchSpec, NObjects, Lock) -> transaction abort | {[Object],Cont} | '$end_of_table'
获取NObjects限制,在示例10,000中为NObject。
但同样的文件也说:
For efficiency the NObjects is a recommendation only and the result may contain anything from an empty list to all available results.
这就是你没有获得10,000个记录的一致批次的原因,因为NObject不是限制,而是推荐批量大小。
如果你想获得你的10,000条记录,你就没有别的选择来编写自己的函数,但是select / 4是以这种方式编写的,用于优化目的,所以很可能你将编写的代码将会比原始代码慢。
顺便说一句,您可以在https://github.com/erlang/otp/tree/master/lib/mnesia/src
上找到mnesia源代码