小编try*_*try的帖子

Erlang:优化复杂的qlc

我有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)

erlang optimization join ets

20
推荐指数
1
解决办法
788
查看次数

Erlang:如何分析qlc:q是执行全表扫描,键前缀扫描还是键查找?

如何分析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 profiling

9
推荐指数
1
解决办法
333
查看次数

Erlang:带有时区算法的时间戳

在 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 的本地时区,我们甚至不能做这样的事情。

我通过谷歌搜索找到的答案是:

  1. setenv 使本地时区 = 所需时区(这首先非常难看;然后它只允许将所需时区转换为 utc 并针对 utc 进行算术,而不是所需时区)
  2. open_port 到 linux date util 并在那里做算术(不是那么难看;相当慢;需要一些解析,因为 erlang 和 date 之间的协议将是文本的)
  3. 使用其标准库将端口驱动程序或 erl_interface 连接到 C(一点也不难看;但我没有找到可用的解决方案,而且我不太擅长用 C 编写一个)

理想的解决方案是使用操作系统时区信息在 Erlang 中编写的内容,但我没有找到任何解决方案。

现在我坚持解决方案 2(open_port to date util)。有没有更好的办法?

提前致谢。

PS 有一个类似的问题,但没有很好的答案时区列表问题

math erlang timezone datetime timestamp

5
推荐指数
1
解决办法
2787
查看次数

标签 统计

erlang ×3

datetime ×1

ets ×1

join ×1

math ×1

optimization ×1

profiling ×1

timestamp ×1

timezone ×1