我有数据库,用户订阅主题.目前,SQL数据库中存储了大约20 000个主题,20万个用户和200万个订阅.由于它的大小,数据库按主题分区,因此我无法在一个数据库查询中获取信息.有几个主题有10万个订阅,一对有10万,其他有数百或更少.
当一个事件发生时,它通常匹配几个主题,所以为了通知用户,我需要执行查询,例如"给我所有用户订阅主题x,y,z并执行集合的联合",以便一个用户获得新闻即使他同时订阅了主题x和z.
限制是:
我想过为每个主题使用一组布隆过滤器,但是它们的约束是相反的:"用户要么没有订阅肯定,要么可能订阅".我需要一些类似"用户订阅肯定或可能不是"的内容.
有损哈希表可能是个好主意,但我不确定,如果它们可以像布隆过滤器那样具有内存效率,而且我担心它会永远是同一个用户,那就是缺少他主题中的内容.
你知道其他任何数据结构,这对解决这个问题有好处吗?
我正在用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?
我想在一个大清单上做一个平行地图.代码看起来有点像这样:
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结合了函数并将组合函数应用于流中的元素,这意味着序列是这样的:
在这种情况下,它不会并行执行.我是对的还是我错过了什么?
如果我是对的,那么这段代码呢?
Stream.map Task.async ...
|> Enum.map Task.await ...
Run Code Online (Sandbox Code Playgroud)
这是否会并行运行?
我有一个需要使用随机整数的测试用例,所以我有:
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用于在测试用例中随机化其测试用例的种子?
我的问题是,我们希望用户输入这样的代码:
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 的东西,但忽略用户在第二个字符串中添加的缺失字母,但这会允许代码中间出现错误的字母。
在用户输入中搜索代码似乎好一点,但仍然不是很干净。
我想在一台机器上使用Exrm和Erlang.
我需要创建多个版本,这些版本仅与节点名称不同.
我知道,我可以配置节点名称rel/vm.args,但它将是静态的.我能以某种方式生成具有不同节点名称的多个版本吗?
我正在使用Phoenix和Ecto 2.0.我很惊讶我可以传递my_field:map到生成器并且它正确地生成带有地图的模型.
它还生成了视图,字段只是字符串输入,验证失败,因为字符串不是映射.
这个字符串是否有格式转换为地图?
我知道没有用HTML编辑地图的标准方法.只是好奇是否在生成的代码中自动解析字符串是个好主意.这种方式发电机总能产生工作解决方案.
我在 Heroku 上部署 Elixir/Phoenix 应用程序时遇到问题。当 Heroku 重新启动或停止 dyno 时,它会发送SIGTERM给所有用户进程。Erlang 在应用程序启动时启动 3 个进程:
erl_child_setup发送SIGTERM到erl_child_setup导致 VM 崩溃并生成erl_crash.dump.
发送SIGTERM到所有进程经常用于确保正常关闭。在研究崩溃原因时,我发现人们在停止运行 Erlang 的 docker 容器时遇到了类似的问题。
我的问题是:有没有办法在erl_child_setup获取时正常关闭虚拟机,SIGTERM或者有没有办法指示 Heroku 不发送SIGTERM到erl_child_setup?
我有一张地图,我想对几个功能使用单一的真实来源。让我们说它是:
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 …