Amazon web services AWS Lambda,如何使用昂贵的数据结构构建永不改变的数据结构(图形)?

Amazon web services AWS Lambda,如何使用昂贵的数据结构构建永不改变的数据结构(图形)?,amazon-web-services,lambda,aws-lambda,Amazon Web Services,Lambda,Aws Lambda,这是一个理论问题。我知道我可以很容易地解决前面提到的示例问题 通过使用一些AWS图形数据库。我真的需要让lambda函数本身在内存中保存的更大的数据结构上工作,而不是外包图形计算之类的东西。该图仅用作示例 设置: 假设我想在我的一个项目中使用AWS Lambda。 这个项目提供了一个API来搜索从顶点a到顶点B的永不改变的图中的最短路径。 因为这些请求是无状态的,所以对于AWS Lambda这样的东西来说是完美的 使用模式: 这项服务并不经常使用。比如说一天十次。但是当有人 使用它,他们可能会在

这是一个理论问题。我知道我可以很容易地解决前面提到的示例问题 通过使用一些AWS图形数据库。我真的需要让lambda函数本身在内存中保存的更大的数据结构上工作,而不是外包图形计算之类的东西。该图仅用作示例

设置: 假设我想在我的一个项目中使用AWS Lambda。 这个项目提供了一个API来搜索从顶点a到顶点B的永不改变的图中的最短路径。 因为这些请求是无状态的,所以对于AWS Lambda这样的东西来说是完美的

使用模式: 这项服务并不经常使用。比如说一天十次。但是当有人 使用它,他们可能会在短时间内多次使用它

问题是: 要处理的图形是静态的,它永远不会改变。但它相当大,如果 从一些类似XML的数据构建它需要几秒钟。在程序中,图形包括 一个顶点类的几千个实例,每个顶点都有一组相邻顶点。(无向图)

问题是: 我将如何使用AWS lambda实现这一点?(示例代码将是java,但由于这是理论性的,是关于aws而不是java的,所以不重要)

  • 当然,每次请求服务时,我都可以从XML构建这个图。 但每次都需要几秒钟的时间来构建永不改变的对象结构, 这是不合适的

  • 我可以将图形结构持久化到临时内存(/tmp),这样它就可以在后续内存中重用 只要请求发生在aws使lambda实例环境保持活动状态的4:30分钟(让我们调用一个会话中的4:30分钟)窗口内,就可以发出请求。 但将其作为序列化版本加载可能也需要一些时间

我想在同一个“会话”中为后续请求保留内存结构本身。 如果可以将每个“会话”的图用于该窗口内的后续请求,则为每个“会话”重建该图不会是问题

你将如何解决这个问题,在一个需要时间构建的永不改变的结构上工作

或者我完全错过了什么

编辑: 好的,我发现你可以把图形的构造放到初始化中,然后把它存储在一个变量中。这就解决了如何在后续对同一容器的请求中重用图形的问题

但更大的问题仍然存在,是否有可能重用内存中永不改变(也称为无状态)的数据结构


我不确定这个问题是否适合stackoverflow,因为严格来说,它与编程无关。但这也肯定不是关于服务器(serverfault)。

因为它是一个静态图,您可以预先计算所有路径,并将它们存储在适当的数据格式中。然后Lambda可以使用简单的查找方法来获取预先计算的路径。此格式的具体外观可能会有所不同,并且根据图形的大小,存储方法也可能有所不同,请参见下面的示例


对于基于文件的存储,可以使用JSON作为键/值。关键点包含开始和结束顶点,该值是中间顶点的列表。如果顶点未连接,则没有相应的关键点,例如

{
  "AB": ["C", "D", "E"],
  "AC": [], // empty list indicates a direct connection
  "AD": ["C"], 
  "AD": ["C", "D"],
  "BA": ["E", "D", "C"],
  // etc
}
如果您想知道从
A
B
的路径,只需生成键
AB
,路径将是
C
D
E

您还可以使用嵌套的JSON格式:

{
  "A": {
      "B": ["C", "D", "E"],
      "C": [], // empty list indicates that there is a direct connection between A and C
      "D": ["C"],
      "E": ["C", "D"]
  },
  "B": {
      "A": ["E", "D", "C"]
      // etc
  }
  // etc
}
在这里,通过查找值
A.B
,可以找到从
A
B
的路径



对于大型图形/数据集,可能是AWS堆栈上的一个合适选项。建模的一种方法是使用一个属性,其中开始顶点可以是主键,结束顶点可以是排序键。然后,路径可以是带有中间顶点的字符串列表,如文件示例中所示。

关于您的陈述“我知道,通过使用AWS GraphDatabase,我可以非常轻松地解决所述示例问题”。考虑到AWS没有任何图形数据库服务,这将不是一项容易的任务。有一种叫做“titan”或类似的东西,通过利用dynamoDB实现了一个类似图形的数据库。但正如我所说。这个图表只是一个例子。我不是真的想找到最短的路。谢谢你的回答。不幸的是,您解决了这个问题,这只是一个潜在问题“如何重用昂贵的数据结构”的示例