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张量的存储。