首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >用碎表分页

用碎表分页
EN

Stack Overflow用户
提问于 2015-06-10 22:36:36
回答 1查看 319关注 0票数 2

我有一个mnesia表,配置如下:

代码语言:javascript
复制
-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的东西

代码语言:javascript
复制
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。

我要怎么做才能把批次一直给我?

EN

回答 1

Stack Overflow用户

回答已采纳

发布于 2015-06-11 19:35:52

问题在于您期望mnesia:select/4,它被记录为:

代码语言:javascript
复制
select(Tab, MatchSpec, NObjects, Lock) -> transaction abort | {[Object],Cont} | '$end_of_table'

要获得NObjects限制,在示例10,000中为NObjects。

但同样的文件也说:

代码语言:javascript
复制
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源代码。

票数 1
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/30768490

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档