Python 来自 Lua 的共享内存访问
Python sharedmem access from Lua
我不得不反复将一个大数组从 Lua 移动到 Python。目前,我 运行 Lua 代码作为 Python 的子进程,并从其标准输出读取数组。这比我想要的要慢得多,而且瓶颈似乎几乎完全是 Python p.stdout.read([byte size of array])
调用,因为 运行 隔离 Lua 代码要快得多.
根据我的阅读,改进管道的唯一方法是使用共享内存,但是(几乎)总是在不同 Python 进程之间而不是 [=21] 之间讨论多处理=] 和一个子进程。
Python 和 Lua 之间是否有合理的内存共享方式?相关答案建议使用直接调用 shm_open 但我宁愿使用预构建的 modules/packages 如果它们存在。
在继续研究共享内存之前,我建议做一些分析实验以准确确定时间花在了哪里。
如果您的实验证明您在进程之间花费了太多时间 serializing/deserializing 数据,那么使用共享内存以及旨在避免这种成本的格式 Cap'n Proto 可能是一个很好的解决方案。
快速搜索找到了这两个库:
lua-capnproto -
Lua-capnp 是基于 luajit.
的纯 lua capnproto 实现
pycapnp - 这是 Cap'n Proto 库的 C++ 实现的 python 包装。
但一定要先做分析。
还有什么原因 lupa 不适合你?
这是我使用 Lua 的 Torch 和 Python 的 NumPy 找到的解决方案。 Lua 代码是 运行 来自 Python 使用 lupa。
在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_array
构造为指向Torch张量的存储。
我不得不反复将一个大数组从 Lua 移动到 Python。目前,我 运行 Lua 代码作为 Python 的子进程,并从其标准输出读取数组。这比我想要的要慢得多,而且瓶颈似乎几乎完全是 Python p.stdout.read([byte size of array])
调用,因为 运行 隔离 Lua 代码要快得多.
根据我的阅读,改进管道的唯一方法是使用共享内存,但是(几乎)总是在不同 Python 进程之间而不是 [=21] 之间讨论多处理=] 和一个子进程。
Python 和 Lua 之间是否有合理的内存共享方式?相关答案建议使用直接调用 shm_open 但我宁愿使用预构建的 modules/packages 如果它们存在。
在继续研究共享内存之前,我建议做一些分析实验以准确确定时间花在了哪里。
如果您的实验证明您在进程之间花费了太多时间 serializing/deserializing 数据,那么使用共享内存以及旨在避免这种成本的格式 Cap'n Proto 可能是一个很好的解决方案。
快速搜索找到了这两个库:
lua-capnproto - Lua-capnp 是基于 luajit.
的纯 lua capnproto 实现
pycapnp - 这是 Cap'n Proto 库的 C++ 实现的 python 包装。
但一定要先做分析。
还有什么原因 lupa 不适合你?
这是我使用 Lua 的 Torch 和 Python 的 NumPy 找到的解决方案。 Lua 代码是 运行 来自 Python 使用 lupa。
在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_array
构造为指向Torch张量的存储。