Database 从mnesia中选择随机记录

Database 从mnesia中选择随机记录,database,erlang,mnesia,Database,Erlang,Mnesia,我有一个mnesia表t,其中包含带有单个字段x的记录。如何从t中选择随机值x 为了避免整个数学迂腐的过程:我不关心随机数生成的细节,我只希望每次的结果都不一样 谢谢, -tjw效率不高,但可以: 生成随机整数X 获取表格大小 使用mnesia获取指针:first 对随机记录迭代X次 查找记录 更复杂: 创建包含整数的额外字段 整数在每次设置时递增 在额外字段上创建索引 随机数X 以X为键的脏读索引行 还有一点: 使用int作为主键 随机整数 检索该行 这些解决方案中的每一个都有重要的故障:通过

我有一个mnesia表
t
,其中包含带有单个字段
x
的记录。如何从
t
中选择随机值
x

为了避免整个数学迂腐的过程:我不关心随机数生成的细节,我只希望每次的结果都不一样

谢谢,

-tjw

效率不高,但可以:

  • 生成随机整数X
  • 获取表格大小
  • 使用mnesia获取指针:first
  • 对随机记录迭代X次
  • 查找记录
  • 更复杂:

  • 创建包含整数的额外字段
  • 整数在每次设置时递增
  • 在额外字段上创建索引
  • 随机数X
  • 以X为键的脏读索引行
  • 还有一点:

  • 使用int作为主键
  • 随机整数
  • 检索该行

  • 这些解决方案中的每一个都有重要的故障:通过使用
    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表中随机选择一行,对吗?