我有qlc
RefsBlocked = qlc:e(qlc:q([
Ref1 ||
{{Ref1, {pattern, {_Status1, _Pattern1, Limit1}}}, Count} <- dict:to_list(
qlc:fold(
fun({Key, _Ref2}, Acc) ->
dict:update_counter(Key, 1, Acc)
end,
dict:new(),
qlc:q([
{{Ref1, {pattern, {Status1, Pattern1, Limit1}}}, Ref2} ||
{Ref2, {status, Status2}} <- ets:table(Tmp),
{Ref3, {tag, Tag3}} <- ets:table(Tmp),
Ref2 =:= Ref3,
{Ref1, {pattern, {Status1, Pattern1, Limit1}}} <- ets:table(Tmp),
Ref =:= Ref1,
Status1 =:= Status2,
Pattern1 =:= Tag3
])
)
),
Count >= Limit1
], unique))
Run Code Online (Sandbox Code Playgroud)
其中Tmp是bag类型的ets,Ref是我需要测试的特定标识符.
Ets包含数百到数千个条目
{Ref1, {definition, {Tuple1}}}
{Ref1, {status, scheduled}}
{Ref1, …Run Code Online (Sandbox Code Playgroud) 如何分析qlc:q是执行全表扫描,键前缀扫描还是键查找?
例如,使用{{KeyPrefix,KeySuffix},Value}等条目设置的类型的ets将会
qlc:q([
{{KeyPrefix, KeySuffix}, Value} ||
{{KeyPrefix, KeySuffix}, Value} <- ets:table(Table),
KeyPrefix =:= Something
])
Run Code Online (Sandbox Code Playgroud)
进行全表扫描或键前缀扫描?
在 Erlang 中相对于时区向特定时间戳添加/减去单位的最佳方法是什么?
据我所知,stdlib 的日历可以使用本地或 UTC 时区,仅此而已。此外,建议仅在 UTC 时区进行算术(原因很明显)。
例如,如果我需要在 CET(中欧时间)和本地(系统)时间中向 {{2011,3,24},{11,13,15}} 添加 1 个月,我该怎么办区不是CET吗?这甚至与将此时间戳转换为 UTC、添加 31 * 24 * 60 * 60 秒并转换回 CET 不同(这将给出 {{2011,4,24},{12,13,15}} 而不是{{2011,4,24},{11,13,15}})。顺便说一下,如果 CET 不是 stdlib 的本地时区,我们甚至不能做这样的事情。
我通过谷歌搜索找到的答案是:
理想的解决方案是使用操作系统时区信息在 Erlang 中编写的内容,但我没有找到任何解决方案。
现在我坚持解决方案 2(open_port to date util)。有没有更好的办法?
提前致谢。
PS 有一个类似的问题,但没有很好的答案时区列表问题