我有一个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。
我要怎么做才能把批次一直给我?
发布于 2015-06-11 19:35:52
问题在于您期望mnesia:select/4,它被记录为:
select(Tab, MatchSpec, NObjects, Lock) -> transaction abort | {[Object],Cont} | '$end_of_table'要获得NObjects限制,在示例10,000中为NObjects。
但同样的文件也说:
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源代码。
https://stackoverflow.com/questions/30768490
复制相似问题