问题标签 [ets]
For questions regarding programming in ECMAScript (JavaScript/JS) and its various dialects/implementations (excluding ActionScript). Note JavaScript is NOT the same as Java! Please include all relevant tags on your question; e.g., [node.js], [jquery], [json], [reactjs], [angular], [ember.js], [vue.js], [typescript], [svelte], etc.
erlang - Erlang/ets:得到“错误参数”后重置 ets 表?
我一直在学习如何使用 ets,但困扰我的一件事是,偶尔*,ets:match
会抛出一个bad argument
……而且,从他们开始,所有后续调用(甚至是以前有效的调用)也会抛出一个bad argument
:
有没有办法“重置”ets
系统,以便我可以再次查询它(即,从外壳)?
*:我无法重现该问题……但是当我尝试做“其他事情”时,它经常发生。
erlang - 带有 dict vs mnesia 表 vs ets 的 gen_server
我正在构建一个 erlang 服务器。用户向服务器发送 http 请求以更新其状态。服务器上的 http 请求进程将用户状态消息保存在内存中。服务器每分钟将所有消息发送到远程服务器并清除内存。如果用户在一分钟内多次更新他的状态,最后一条消息将覆盖前一条消息。重要的是,在读取所有消息和清除它们之间,没有其他进程能够写入状态消息。
实施它的最佳方法是什么?
带有字典的 gen_server。密钥将是用户 ID。dict:store/3 将更新或创建状态。gen_server 解决了“事务”问题。
带有 ram_copies 的 mnesia 表。处理事务,我不需要实现 gen_server。这个解决方案有太多开销吗?
ETS 表更轻量并且有一个 gen_server。是否可以在 ETS 中进行交易?在读取所有消息和清除它们之间锁定表?
谢谢
erlang - 使用 ETS Select 形成交叉口
我有以下 ets 结构:
我想使用 ets:select 和 fun2ms 获得 set1 和 set2 的交集,结果将是 [item1, item2]。
我花了好几个小时试图用 ets:select 和 fun2ms 来完成它,但没有成功。你能帮我使用 ets:select 和 fun2ms 吗?
感谢所有答案!
ps:我知道sets模块,但我必须使用ets和这个确切的数据结构。
erlang - Erlang:在 ets 表中查找交点
我有一个带有下一个项目的 ets:
我有清单[[at, door, me],[on, floor, chair],[small, bannanas]]
我需要将 ets 表中的每个项目与列表中的一个项目进行比较,如果第一个是同一个原子,则替换圆括号中的项目。因此,如果我有[at, door, me]
,它与 匹配[at, {other_place}, me]
,我必须更改{other_place}
所有 ets 表中的原子门。
erlang - 在每条记录上使用 ets:foldl 作为穷人的 forEach
简短版本:在ets:foldl
迭代每个 ETS 记录时删除它们是否安全?
假设 ETS 表正在积累信息,现在是时候处理所有信息了。从表中读取一条记录,以某种方式使用,然后删除。(另外,假设表是private
,所以没有并发问题。)
在另一种语言中,具有类似的数据结构,您可以使用 for...each 循环,处理每条记录,然后将其从 hash/dict/map/whatever 中删除。但是,该ets
模块没有foreach
例如lists
。
但这可能有效:
这是首选方法吗?它至少是正确且没有错误的吗?
我对在处理数据结构时修改数据结构有一个普遍的担忧,但是ets:foldl 文档暗示 ETS 对您修改内部记录非常满意foldl
。因为我基本上是在把桌子擦干净,所以我想确定一下。
我正在使用带有set
表格的 Erlang R14B,但是我想知道任何 Erlang 版本或任何类型的表格是否有任何警告。谢谢!
erlang - 大多只读使用 DETS
所以我一直在使用 ETS - 效果很好。但是,我将它用作路由数据的缓存 - 我在加载模块时加载它,并在进行更改时保存(读取远多于写入)。
我在想 DETS 会让事情变得更干净——我不必担心管理表的持久性。这会很好地使用 DETS 吗?(大小不是问题,主要关注读取性能的大幅提高 - 所有数据都可以轻松放入内存)。
optimization - Erlang:优化复杂的 qlc
我有qlc
其中 Tmp 是 bag 类型的 ets, Ref 是我需要测试的特定标识符。
Ets 包含数百到数千个条目,例如
即,对于每个 Ref,有一个定义、一个或两个(四个)状态、零个或多个(在大多数情况下不超过 3 个)模式和零个或多个(在大多数情况下不超过 3 个)标签。
我需要测试一个特定的标识符是否被其他标识符阻止。当与其标签上的任何模式匹配的标识符数量 = 其模式并且它们的状态 = 其模式状态大于或等于其模式限制时,它将被阻止。
有没有办法优化qlc?
erlang - 加速和最佳实践:将 ets 用于每个模块的预计算数据
((请原谅我在一个线程中问了多个问题。我认为它们是相关的。))
您好,我想知道 Erlang 在每个模块的预编译数据方面存在哪些最佳实践。
示例:我有一个模块,它对一个已知的、非常复杂的正则表达式进行大量操作。re:compile/2 的文档说:“编译一次并执行多次比每次要匹配时都编译效率高得多”。由于没有指定 re 的 mp() 数据类型,因此如果您想要一个独立于目标的梁,则不能在编译时放置,因此必须在运行时编译 RegEx。((注意: re:compile/2 只是一个例子。任何要记忆的复杂函数都适合我的问题。))
Erlang 的模块 (can) 有一个-on_load(F/A)
属性,表示加载模块时应该执行一次的方法。因此,我可以将我的正则表达式放入此方法中进行编译,并将结果保存在一个名为?MODULE
.
在丹的回答后更新。
我的问题是:
- 如果我理解 ets 正确,它的数据保存在另一个进程中(与进程字典不同),并且检索 ets 表的值非常昂贵。(如果我错了,请证明我错了!) ets 中的内容是否应该复制到进程字典中以加快速度?(记住:数据永远不会被更新。)
- 将所有数据作为一条记录(而不是许多表项)放入 ets/process 字典中是否有任何(相当大的)缺点?
工作示例:
erlang - erlang:用真正的“乐趣”调用的函数应该用 parse_transform 转换?
我正在看 O'Reilly Erlang Programming book 并且有一个在 erlang shell 中运行的示例,如下所示:
但是,当我在代码中(而不是在 shell 中)执行类似操作时:
我得到了FUBAR:
(顺便说一句,我想知道为什么错误不是'用......调用的函数'可能是这样 io:format("~p", TheErrorMessage) 会换行?)
无论如何,我已经放弃了选择,转而使用 ets:foldl,因为后者有效,并且 - 通过有趣的异常 - 允许我在找到第一个项目时终止遍历。但是,我还是很好奇...
...世界卫生大会?(我在 parse_transform 上做了一些阅读,而且我对 erlang 足够陌生,以至于我错过了连接。)
process - Erlang ETS 表与消息传递:优化问题?
我正在进入一个现有的(游戏)项目,其服务器组件完全用 erlang 编写。有时,从拥有该系统的进程中获取一条数据(我对播放器 56 有多少小部件感兴趣)可能会非常痛苦。假设我可以找到拥有数据的进程,我可以将消息传递给该进程并等待它传回消息,但这不能很好地扩展到多台机器并且它会缩短响应时间。
我一直在考虑用一个系统替换该游戏中存在的许多任务,在该系统中,多个进程经常访问的信息将存储在受保护的 ets 表中。表的所有者只会接收更新消息(玩家刚刚花费了五个小部件)并相应地更新表。它将捕获所有异常并简单地继续下一个更新消息。任何想知道玩家是否有足够的小部件来购买傻瓜的过程只需要偷看桌子。(是的,我知道缓冲区中可能有一条消息会减少小部件的数量,但我已经控制了这个问题。)
恐怕我的问题与其说是问题,不如说是征求意见。我会赞成任何既有帮助又有充分解释或参考的内容。
这种实现的可能缺点是什么?我对锁争用的细节很感兴趣,我可能会在拥有一个写者多个读者的情况下看到,在多台机器上分发它会遇到什么样的问题,尤其是:来自做过的人的输入这之前。