小编tko*_*wal的帖子

是否存在用于存储关系的概率数据结构?

我有数据库,用户订阅主题.目前,SQL数据库中存储了大约20 000个主题,20万个用户和200万个订阅.由于它的大小,数据库按主题分区,因此我无法在一个数据库查询中获取信息.有几个主题有10万个订阅,一对有10万,其他有数百或更少.

当一个事件发生时,它通常匹配几个主题,所以为了通知用户,我需要执行查询,例如"给我所有用户订阅主题x,y,z并执行集合的联合",以便一个用户获得新闻即使他同时订阅了主题x和z.

限制是:

  • 联合集中必须没有重复项.(用户无法获取内容两次)
  • 联合集中可能缺少大量用户.(如果有时候用户没有获得内容,那就不是那么糟糕,但它不能总是同一个主题的同一个用户)
  • 可以订阅新主题而无需重建整个事物.

我想过为每个主题使用一组布隆过滤器,但是它们的约束是相反的:"用户要么没有订阅肯定,要么可能订阅".我需要一些类似"用户订阅肯定或可能不是"的内容.

有损哈希表可能是个好主意,但我不确定,如果它们可以像布隆过滤器那样具有内存效率,而且我担心它会永远是同一个用户,那就是缺少他主题中的内容.

你知道其他任何数据结构,这对解决这个问题有好处吗?

algorithm set storing-data data-structures

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

在gradle中执行bash脚本

我正在用geb进行功能测试.

我的应用程序使用virgo进行部署,并使用HSQLDB存储数据.我想对这个工作版本的应用程序进行测试,但我想从空数据库开始,每次运行webtests.

我写了一个简单的bash脚本

#!/bin/sh
rm -rf $VIRGO_HOME/aresdb*
$VIRGO_HOME/bin/shutdown.sh &
sleep 10
$VIRGO_HOME/bin/startup.sh &
Run Code Online (Sandbox Code Playgroud)

删除数据库并重新启动处女座.

但是,当我将它添加到我的build.gradle任务执行命令时永远不会结束.

task cleanDB(type: Exec) {
    commandLine './clean.sh' 
}
Run Code Online (Sandbox Code Playgroud)

为什么会这样?当我在控制台中运行此脚本时,它会快速返回(但处女座仍会写入控制台).

我试图在单独的线程中运行它,但我遇到以下错误:

task cleanDBThread()<<{
    def cleanDBThread1 = Thread.start {
         cleanDB.execute()
    }
    sleep 10000
    println "wake up!"
}

Exception in thread "Thread-32" java.lang.IllegalStateException:
Cannot start long running operation, as the task artifact state cache
(/home/tomasz/ares/.gradle/1.0-milestone-9/taskArtifacts) has not been locked.
Run Code Online (Sandbox Code Playgroud)

我也尝试在hibernate配置中设置'create-drop',但它也需要重启virgo.即使重新部署应用程序也无济于事.

如何使用空数据库运行webtests?

testing hibernate gradle

14
推荐指数
1
解决办法
2万
查看次数

Elixir Stream中的Task.async

我想在一个大清单上做一个平行地图.代码看起来有点像这样:

big_list
|> Stream.map(&Task.async(Module, :do_something, [&1]))
|> Stream.map(&Task.await(&1))
|> Enum.filter filter_fun
Run Code Online (Sandbox Code Playgroud)

但是我正在检查Stream实现,据我所知,它Stream.map结合了函数并将组合函数应用于流中的元素,这意味着序列是这样的:

  1. 拿第一个元素
  2. 创建异步任务
  3. 等待它完成
  4. 采取第二个elelemnt ...

在这种情况下,它不会并行执行.我是对的还是我错过了什么?

如果我是对的,那么这段代码呢?

Stream.map Task.async ...
|> Enum.map Task.await ...
Run Code Online (Sandbox Code Playgroud)

这是否会并行运行?

parallel-processing elixir

13
推荐指数
2
解决办法
4948
查看次数

在ExUnit测试用例中获取种子并使用随机数

我有一个需要使用随机整数的测试用例,所以我有:

test "test with random integer" do      
  IO.inspect :random.uniform(10)
  assert true
end
Run Code Online (Sandbox Code Playgroud)

当我运行它时,它总是打印4,即使我可以在控制台输出中看到不同的种子:

Randomized with seed 197796
...
Randomized with seed 124069
Run Code Online (Sandbox Code Playgroud)

我知道我应该使用:random.seed/1:random.seed/3.我想使用与测试输出结束时打印的种子相同的种子.这样,如果我的测试失败,我可以复制它

mix test --seed 124069
Run Code Online (Sandbox Code Playgroud)

如果我使用的话,我不能这样做:random.seed(:erlang.now).

如何获取ExUnit用于在测试用例中随机化其测试用例的种子?

random elixir

6
推荐指数
1
解决办法
1087
查看次数

检查一个字符串是否包含与其他字符串的 Levenshtein 距离为 1 的子字符串

我的问题是,我们希望用户输入这样的代码: 639195-EM-66-XA-53-WX在输入中的某处,因此结果可能如下所示:The code is 639195-EM-66-XA-53-WX, let me in。如果他们在代码中犯了一个小错误(编辑距离为 1),我们仍然希望匹配该字符串。例如The code is 739195-EM-66-XA-53-WX, let me in。(改为6代码7的第一个字母)

即使用户跳过破折号,算法也应该匹配,并且应该忽略小写/大写字母。这些要求很容易满足,因为我可以删除所有破折号并执行 to_uppercase。

有类似的算法吗?

生成与原始代码距离为 1 的所有字符串的计算成本很高。

我也在考虑使用类似 Levenshtein distance 的东西,但忽略用户在第二个字符串中添加的缺失字母,但这会允许代码中间出现错误的字母。

在用户输入中搜索代码似乎好一点,但仍然不是很干净。

algorithm string-matching levenshtein-distance

6
推荐指数
1
解决办法
1439
查看次数

在Elixir Exrm中参数化节点名称

我想在一台机器上使用Exrm和Erlang.

我需要创建多个版本,这些版本仅与节点名称不同.

我知道,我可以配置节点名称rel/vm.args,但它将是静态的.我能以某种方式生成具有不同节点名称的多个版本吗?

elixir exrm

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

将phoenix.gen.html与地图字段类型混合使用

我正在使用Phoenix和Ecto 2.0.我很惊讶我可以传递my_field:map到生成器并且它正确地生成带有地图的模型.

它还生成了视图,字段只是字符串输入,验证失败,因为字符串不是映射.

这个字符串是否有格式转换为地图?

我知道没有用HTML编辑地图的标准方法.只是好奇是否在生成的代码中自动解析字符串是个好主意.这种方式发电机总能产生工作解决方案.

elixir phoenix-framework

5
推荐指数
0
解决办法
645
查看次数

处理 erl_child_setup 中的信号

我在 Heroku 上部署 Elixir/Phoenix 应用程序时遇到问题。当 Heroku 重新启动或停止 dyno 时,它会发送SIGTERM给所有用户进程。Erlang 在应用程序启动时启动 3 个进程:

  • erl_child_setup
  • Erlang 端口映射器守护进程
  • 实际应用

发送SIGTERMerl_child_setup导致 VM 崩溃并生成erl_crash.dump.

发送SIGTERM到所有进程经常用于确保正常关闭。在研究崩溃原因时,我发现人们在停止运行 Erlang 的 docker 容器时遇到了类似的问题。

我的问题是:有没有办法在erl_child_setup获取时正常关闭虚拟机,SIGTERM或者有没有办法指示 Heroku 不发送SIGTERMerl_child_setup

erlang signals heroku

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

将计算列表传递给 Elixir 宏

我有一张地图,我想对几个功能使用单一的真实来源。让我们说它是:

source_of_truth = %{a: 10, b: 20}
Run Code Online (Sandbox Code Playgroud)

我希望该地图的键是EctoEnum 的值。EctoEnum 提供了一个defenum我应该像这样使用的宏:

  defenum(
    EnumModule,
    :enum_name,
    [:a, :b]
  )
Run Code Online (Sandbox Code Playgroud)

我不想重复[:a, :b]部分。我想像这样使用地图中的键:

  defenum(
    EnumModule,
    :enum_name,
    Map.keys(source_of_truth)
  )
Run Code Online (Sandbox Code Playgroud)

它不起作用,因为defenum宏需要一个简单的列表。

我想我可以通过像这样定义我自己的宏来做到这一点:

 defmacro dynamic_enum(enum_module, enum_name, enum_values) do
   quote do
     defenum(
       unquote(enum_module),
       unquote(enum_name),
       unquote(enum_values)
     )
   end
 end
Run Code Online (Sandbox Code Playgroud)

然后调用:

dynamic_enum(EnumModule, :enum_name, Map.keys(source_of_truth))
Run Code Online (Sandbox Code Playgroud)

然而,它做同样的事情:enum_values不是预先计算的列表,而是 AST for Map.get. 我的下一个方法是:

 defmacro dynamic_enum(enum_module, enum_name, enum_values) do
   quote do
     values = unquote(enum_values)
     defenum(
       unquote(enum_module),
       unquote(enum_name),
       ?
     )
   end
 end
Run Code Online (Sandbox Code Playgroud)

不知道我能把什么放在哪里?。我不能只是values …

macros elixir

4
推荐指数
1
解决办法
700
查看次数