Database 从mnesia中选择随机记录
我有一个mnesia表Database 从mnesia中选择随机记录,database,erlang,mnesia,Database,Erlang,Mnesia,我有一个mnesia表t,其中包含带有单个字段x的记录。如何从t中选择随机值x 为了避免整个数学迂腐的过程:我不关心随机数生成的细节,我只希望每次的结果都不一样 谢谢, -tjw效率不高,但可以: 生成随机整数X 获取表格大小 使用mnesia获取指针:first 对随机记录迭代X次 查找记录 更复杂: 创建包含整数的额外字段 整数在每次设置时递增 在额外字段上创建索引 随机数X 以X为键的脏读索引行 还有一点: 使用int作为主键 随机整数 检索该行 这些解决方案中的每一个都有重要的故障:通过
t
,其中包含带有单个字段x
的记录。如何从t
中选择随机值x
为了避免整个数学迂腐的过程:我不关心随机数生成的细节,我只希望每次的结果都不一样
谢谢,
-tjw效率不高,但可以:
这些解决方案中的每一个都有重要的故障:通过使用
mnesia:all_keys/1
(或等效脏码)功能和random
模块,并发写入性能、读取开销等
random_value(Table) ->
Keys = mnesia:dirty_all_keys(Table),
Key = lists:nth(random:uniform(length(Keys)), Keys),
[#record{x = X}] = mnesia:dirty_read({Table, Key}),
X.
不要忘记使用
random:seed/3
mnesia:all_keys/1初始化种子可能是一个非常昂贵的操作,具体取决于表的大小以及应用程序的性质。随着表的增长,上述函数很可能会消耗更多内存。确实,您必须使用所有键来选择其中一个。您可以在一个单独的表(mnesia或ets)中索引键,并让一些算法选择一个键,而无需在它们上循环。在我的Macbook Pro上,对一个包含1m个元素的表执行mnesia:dirty_all_keys/1
需要300毫秒。我希望你能告诉我们表t中主键的性质,以及记录的性质。我想你的问题是如何从mnesia表中随机选择一行,对吗?