【问题标题】:Select random record from mnesia从 mnesia 中选择随机记录
【发布时间】:2011-09-05 21:58:58
【问题描述】:

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

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

谢谢,
-tjw

【问题讨论】:

  • 我希望您能告诉我们表 t 中主键的性质,以及记录的性质。我认为您的问题是如何从 mnesia 表中选择随机行,对吧?

标签: database erlang mnesia


【解决方案1】:

通过使用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 上使用包含 1 M 个元素的表格执行 mnesia:dirty_all_keys/1 需要 300 毫秒。
【解决方案2】:

效率不高,但会起作用:

  1. 生成随机整数X
  2. 获取表格大小
  3. 使用 mnesia:first 获取指针
  4. 迭代 X 次以随机记录
  5. 查询记录

更复杂:

  1. 创建包含整数的额外字段
  2. 整数在每次设置时递增
  3. 在额外字段上创建索引
  4. 随机数 X
  5. 以 X 作为键的脏读索引行

还有一个:

  1. 使用 int 作为主键
  2. 随机整数
  3. 检索行

这些解决方案中的每一个都有重要的缺陷:并发写入性能、读取开销等。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2019-07-23
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2011-04-08
    • 1970-01-01
    • 2015-01-26
    • 2017-06-28
    相关资源
    最近更新 更多