我有一个程序执行几千蒙特卡罗模拟来预测结果; 我不能说他们真正预测的是什么,所以我将使用"无可争议的圣诞老人存在"中的另一个例子,因为这些算法的内容与问题无关.我想知道Monopoly董事会上每个广场的访问频率(预测哪些是最好的购买物业).为此,我模拟了数千个游戏并整理结果.我目前的实现是一个独立的C#应用程序,但我想将它移动到云端,以便我可以将其作为服务提供 - 每个用户都可以通过提交每个骰子的边数来获得个性化结果.
当前的实现也非常慢 - 它非常简单,因为每个模拟都是完全独立的,但我只有8个内核,因此在我的本地机器上完成大约50000个单独模拟的完整预测需要20分钟.
计划是让AWS lambda函数运行一个(或几个)模拟然后整理 - 基本上mapreduce它.我查看了使用AWS EMR(弹性MapReduce),但这对于我想要的太大了,旋转实例单独运行计算似乎比单独的整个计算花费更长时间(这对于多个小时离线分析,但我希望通过Web请求进行低延迟响应).
我认为理想的是:
Lambda 0 - 触发许多其他lambda函数,每个函数执行一小部分计算.Lambda 1..N - 并行进行多次模拟(数字不是常数).Lambda N + 1 - 整理所有结果并返回答案.
这里有一个lambda mapreduce框架:
https://github.com/awslabs/lambda-refarch-mapreduce
但它似乎有一个主要缺点 - 每次地图阶段完成时,它会将结果写入S3(我可以将其作为临时使用)然后通过事件触发新的lambda.触发lambda看看是否所有结果都已写入存储.如果不是,则结束,如果是,则执行还原步骤.这似乎是一个公平的解决方案,但我只是稍微关注a)当两个结果汇总在一起时,两个减速器都能计算结果?并且b)看起来好像它已经解雇了很多只是决定不运行的lambdas(我知道它们运行起来很便宜,但是每次模拟的数量加倍到两次 - 计算并且可能会减少 - 显然会使成本增加一倍).有没有办法在100个文件写入文件夹而不是每个文件后写入S3结果?
我看了一下使用步骤函数,但是我不确定如何在一步中并行激发多个lambdas并让它们在状态机转换之前全部返回.然而,步骤函数对于最终的皱纹是有用的 - 我想在API后面隐藏所有这些.
根据我的阅读,API可以触发lambda并返回该lambda的结果,但我不希望被调用的lambda是返回结果的lambda.当您从API调用步骤函数时,不是API调用返回最后一个状态的结果.
总之,我想:
API请求 - >并行计算结果 - > API响应
中间的那一点我不清楚该怎么做,同时能够将所有结果作为对原始请求的响应返回 - 或者单独使用它们很容易.
我可以看到几个选项:
使用现在由AWS API网关本机支持的步骤函数,并在一个状态中调用多个lambda,等待它们在转换之前返回.
使用AWS EMR,但以某种方式保持配置的实例始终处于活动状态以避免配置时间开销.这显然否定了Lambda的可扩展性并且更加昂贵.
使用mapreduce框架或类似的东西,找到一种方法来响应来自不同lambda的传入请求到API请求最初调用的请求.理想情况下还要减少此处涉及的S3事件的数量,但这不是优先事项.
立即响应来自第一个lambda的原始API请求,然后在计算完成后将更多数据推送给用户(它们应该只需要大约30秒的并行性,并且域是这样的,这是可以接受的等待时间响应,甚至HTTP响应).
我怀疑它会对解决方案产生任何影响,因为它只是中间位的扩展,而不是根本的改变,但真正的计算是迭代的,所以会是:
请求 - > Mapreduce - > Mapreduce - > ... - >响应
只要我知道如何在一个请求中链接一组lambda函数,链接更多应该更多相同(我希望).
谢谢.
PS我无法创建它们,标签aws-emr
也不aws-elastic-mapreduce
存在.
amazon-web-services aws-lambda aws-api-gateway aws-step-functions
根据d3文档(https://github.com/d3/d3-selection)
按照惯例,返回当前选择的选择方法使用四个缩进空间,而返回新选择的方法仅使用两个.这有助于通过使它们脱离链条来揭示上下文的变化:
提供如下代码:
d3.select("body")
.append("svg")
.attr("width", 960)
.attr("height", 500)
.append("g")
.attr("transform", "translate(20,20)")
.append("rect")
.attr("width", 920)
.attr("height", 460);
Run Code Online (Sandbox Code Playgroud)
有没有办法配置eslint来处理这个问题,这样它就不会一直抱怨意外的咒语等级?
eslint indent
规则(https://eslint.org/docs/rules/indent)有一个MemberExpression
选项,所以你可以忽略链式方法调用的所有缩进,但是我想强制执行,不同的方法不同.还有一个ignoredNodes
选项可以选择忽略某些AST节点,但我不知道文档中是否可以选择我想要的保真度.虽然禁用对某些链式方法的检查并不是很好,但总比没有好.在这种情况下,我怀疑这是一个全面的列表,但我在四空缩进处使用的所有列表都是:
.attr()
.style()
.text()
.call()
.on()
Run Code Online (Sandbox Code Playgroud)
因此,有些方法可以忽略具有这些名称的链式方法调用,并将所有其他方法保留在两个空间中,这将是一个好的止损措施(包括与d3完全无关的方法).
编辑:删除.data()
并.enter()
从列表中,Gerardo Furtado指出他们返回新的选择.
我和其他几个人都可以访问包含 IDE 自动生成的一个文件的存储库。该文件是特定于 PC 的,因此不应位于源代码管理中,但目前是。我想删除它并将其添加到.gitignore
,但我不希望其他协作者在拉取我的更改时将其删除。关于删除文件但保留本地副本存在很多问题;但他们不覆盖其他用户,所以当他们拉动时,尽管我保留了我的副本,他们仍然会丢失副本:
还有一些问题和解决方案,可以在拉取时不丢失本地文件,这样他们就可以保留文件,但这需要拉取时的明确操作,我不想去告诉每个人到底如何拉取这个文件时间。我确实发现了两个重复的问题。得到的答案是不可能,但那都是 5 年前的事了——这期间有什么变化吗?
这很重要,因为该文件是在您首次导入整个项目时自动生成的,并且包含有关本地编译器/库版本的信息。所以删除它需要重新导入。如果有什么区别的话,那就是.idea/scala_compiler.xml
and .idea/scala_settings.xml
(实际上整个.idea
目录应该被忽略)。基本上我想让 Git 将一个文件设置为不再跟踪,但不为任何人删除它。