【问题标题】:How to make Python library Ray shared memory writeable?如何使 Python 库 Ray 共享内存可写?
【发布时间】:2020-11-27 13:49:07
【问题描述】:

一点上下文: 我正在编写一个股票回溯测试程序,它订阅了一个 websocket 提要,该提要为 100 多只股票 1 分钟蜡烛流数据。由于这是一个回测程序,它实际上是由我的本地数据提供的。

我正在尝试利用 Ray 进行多处理。

所以它将在本地循环接收库存数据,例如,A,B,C .... A,B,C ...连续直到时间段结束。目前,我对 Ray 的设置是为每个股票数据异步调用 handleStock.remote()。出于性能原因,每次处理相同的库存但不同的时间时,应该有一些缓存来帮助更快地处理。但是由于每次库存中的每一个都作为 Ray 中的全新进程/工作者运行,我无法共享内存并对其进行写入。我试过 Ray put 方法,但它是只读的。

是否有解决此问题的方法或运行此回测的其他工具?

【问题讨论】:

  • 我不确定 Ray,但如果您使用 numpy 数组,您当然可以写入多进程 shared_memory。您只需要在写入完成时锁定对象,然后在完成后释放它。 @Rboreal_Frippery 的回答 here 是如何做到这一点的一个很好的例子。

标签: python multiprocessing ray


【解决方案1】:

Ray 对象存储值意味着先写者获胜。一种可能的选择是将数据存储在 Actor 中而不是对象存储中。

如果您确实需要返回对象并且性能很重要,则可以将操作分解为 2 个异步操作。

  1. 执行计算
  2. 返回结果

【讨论】:

  • 我什至找不到让工人写到商店价值的方法,你是怎么做到的?最多 2 个异步操作对我不起作用,因为每个工作人员都有复杂的逻辑,他们可能需要在不同的时间访问共享内存。
  • 对象存储值是不可变的(因此将状态存储在一个actor中)。我不确定你的意思是你不能把它分成两个步骤。例如,您始终可以创建一个演员,它是您真实对象的薄包装。不要调用ray.put,而是将结果存储在你的actor中。第 2 步变成了 ray.put
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2010-11-28
  • 2015-01-19
  • 1970-01-01
  • 1970-01-01
  • 2021-10-03
  • 2010-11-28
  • 2016-12-13
相关资源
最近更新 更多