【发布时间】:2019-05-11 15:26:06
【问题描述】:
我需要在 ets 集中跟踪大量进程,然后随机选择单个进程。所以我创建了这样的集合:
:ets.new(:pid_lookup, [:set, :protected, :named_table])
那么为了争论,让我们在其中粘贴self() 1000 次:
Enum.map 1..1000, fn x -> :ets.insert(:pid_lookup, {x, self()}) end
现在我需要随机选择一个。我知道我可以使用:ets.lookup(:pid_lookup, :rand.uniform(1000)) 随机选择一个,但是如果我事先不知道集合的大小(在上述情况下为 1000)怎么办?
如何找出 ets 集的大小?和/或是否有更好的方法从 ets 数据结构中选择随机 pid?
【问题讨论】:
-
您可以使用
:ets.info(tab, :size)来获取表格的大小。不过,我真的不知道从中获取随机元素的最佳选择。从集合中获取随机 pid 的用例是什么? -
@JustinWood 我只是对 genservers 进行基准测试。我正在创建其中的 1000 个,然后我希望每个都向另一个随机发送消息多次,并查看使用各种消息大小需要多长时间。但是当我创建 Genservers 时,它们会启动,因此其他 genservers 在它们开始发送时可能还没有启动。所以我需要知道在基准测试的初始阶段创建了多少。
-
嗯,1000 当然是任意的。我将根据各种数字检查性能。我本质上是想了解消息传递的速度。
-
如果你只是想测试消息传递,为什么不启动所有的 gen 服务器然后开始发送消息?
-
嗯,我确实想知道如何在 ets 表中随机选择一些东西来进行我所做的一堆统计工作。但是要直接回答您的问题,当我启动 1000 个 Genserver 时,第一个将在最后一个启动之前开始发送。因此,我不能只从 1000 个中选择一个随机数。我需要知道已经旋转了多少,为此我需要知道 ETS 表的大小。