从Lua访问Python sharedmem
我必须反复地将一个大型数组从Lua移动到Python。目前,我将Lua代码作为Python的子进程运行,并从其stdout读取数组。这比我希望的要慢得多,瓶颈似乎完全是Python从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之间有没有合理的共享内存的方法?相关的答
p.stdout.read([byte size of array])
调用,因为单独运行Lua代码要快得多
从我所读到的内容来看,改进管道的唯一方法是使用共享内存,但这(几乎)总是在讨论不同Python进程之间的多处理,而不是Python和子进程之间的多处理
Python和Lua之间有没有合理的共享内存的方法?相关的答案建议使用直接调用,但如果存在,我宁愿使用预构建的模块/包。在深入研究共享内存之前,我建议做一些分析实验,以确定时间到底花在哪里 如果您的实验证明您花费了太多时间在进程之间序列化/反序列化数据,那么使用共享内存和一种旨在避免这种成本的格式可能是一个很好的解决方案 快速搜索发现以下两个库:
- - luacapnp是基于luajit的capnproto的纯Lua实现
还有什么原因对你不起作用吗?在开始研究共享内存之前,我建议做一些分析实验,以准确确定时间花在了什么地方 如果您的实验证明您花费了太多时间在进程之间序列化/反序列化数据,那么使用共享内存和一种旨在避免这种成本的格式可能是一个很好的解决方案 快速搜索发现以下两个库:
- - luacapnp是基于luajit的capnproto的纯Lua实现
还有什么原因不适合您吗?下面是我使用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函数,而不是通过管道构建调用它们的协议。