从Lua访问Python sharedmem

从Lua访问Python sharedmem,python,numpy,lua,shared-memory,Python,Numpy,Lua,Shared Memory,我必须反复地将一个大型数组从Lua移动到Python。目前,我将Lua代码作为Python的子进程运行,并从其stdout读取数组。这比我希望的要慢得多,瓶颈似乎完全是Pythonp.stdout.read([byte size of array])调用,因为单独运行Lua代码要快得多 从我所读到的内容来看,改进管道的唯一方法是使用共享内存,但这(几乎)总是在讨论不同Python进程之间的多处理,而不是Python和子进程之间的多处理 Python和Lua之间有没有合理的共享内存的方法?相关的答

我必须反复地将一个大型数组从Lua移动到Python。目前,我将Lua代码作为Python的子进程运行,并从其stdout读取数组。这比我希望的要慢得多,瓶颈似乎完全是Python
p.stdout.read([byte size of array])
调用,因为单独运行Lua代码要快得多

从我所读到的内容来看,改进管道的唯一方法是使用共享内存,但这(几乎)总是在讨论不同Python进程之间的多处理,而不是Python和子进程之间的多处理


Python和Lua之间有没有合理的共享内存的方法?相关的答案建议使用直接调用,但如果存在,我宁愿使用预构建的模块/包。

在深入研究共享内存之前,我建议做一些分析实验,以确定时间到底花在哪里

如果您的实验证明您花费了太多时间在进程之间序列化/反序列化数据,那么使用共享内存和一种旨在避免这种成本的格式可能是一个很好的解决方案

快速搜索发现以下两个库:

  • - luacapnp是基于luajit的capnproto的纯Lua实现

  • > P>这是Python的Copn原库的C++实现包。

但一定要先做分析


还有什么原因对你不起作用吗?

在开始研究共享内存之前,我建议做一些分析实验,以准确确定时间花在了什么地方

如果您的实验证明您花费了太多时间在进程之间序列化/反序列化数据,那么使用共享内存和一种旨在避免这种成本的格式可能是一个很好的解决方案

快速搜索发现以下两个库:

  • - luacapnp是基于luajit的capnproto的纯Lua实现

  • > P>这是Python的Copn原库的C++实现包。

但一定要先做分析


还有什么原因不适合您吗?

下面是我使用Lua的Torch和Python的NumPy找到的解决方案。Lua代码是使用lupa从Python运行的

main.lua中

require 'torch'

data_array = torch.FloatTensor(256, 256)

function write_data()
    return tonumber(torch.data(data_array:contiguous(), true))
end
来自Python:

import ctypes
import lupa
import numpy as np

data_shape = (256, 256)

lua = lupa.LuaRuntime()
with open('main.lua') as f: lua.execute(f.read())
data_array = np.ctypeslib.as_array(ctypes.cast(ctypes.c_void_p(lua.globals().write_data()), ctypes.POINTER(ctypes.c_float)), shape=data_shape)

data\u数组
被构造为指向Torch张量的存储。

下面是我使用Lua的Torch和Python的NumPy找到的解决方案。Lua代码是使用lupa从Python运行的

main.lua中

require 'torch'

data_array = torch.FloatTensor(256, 256)

function write_data()
    return tonumber(torch.data(data_array:contiguous(), true))
end
来自Python:

import ctypes
import lupa
import numpy as np

data_shape = (256, 256)

lua = lupa.LuaRuntime()
with open('main.lua') as f: lua.execute(f.read())
data_array = np.ctypeslib.as_array(ctypes.cast(ctypes.c_void_p(lua.globals().write_data()), ctypes.POINTER(ctypes.c_float)), shape=data_shape)

数据\u数组
被构造为指向Torch张量的存储。

我确实需要数据作为一个numpy数组(要求它在内存中是连续的),而lupa没有解决这个问题。我明白了。我错过了numpy的要求。声称支持numpy,但与ndarray一起使用的提交是从2012年开始的。然而,这一评论很有希望:Lupa确实消除了对管道的需求,这是好事。我把它包括在我的答案中。无论哪种方式,开销都几乎为零,因为它只传递一个指向数据的指针。在这种情况下,lupa允许的主要优点是直接调用Lua函数,而不是通过管道构建调用它们的协议。我确实需要数据作为numpy数组(要求它在内存中是连续的),lupa没有解决这个问题。我明白了。我错过了numpy的要求。声称支持numpy,但与ndarray一起使用的提交是从2012年开始的。然而,这一评论很有希望:Lupa确实消除了对管道的需求,这是好事。我把它包括在我的答案中。无论哪种方式,开销都几乎为零,因为它只传递一个指向数据的指针。在这种情况下,lupa允许的主要优点是直接调用Lua函数,而不是通过管道构建调用它们的协议。