1

我有一个应用程序,我通过 LuaSockets 从网络(500KB)获取大量二进制数据。(还没有实现这部分)。根据我所知道的,这些数据将存储在某种字符串或表或数组中。

我需要对这些数据进行复杂的处理,并且我有一个现有的、经过验证的 ANSI-C Lib,我需要将数据传递给 C。我研究过的方法通常在调用堆栈中传递数据,这是行不通的由于数据大小,对我来说。

现有的 ANSI-C 库需要一个指向数据和大小的指针。我可能可以用一个新的 API 包装这个 API,它逐字节地排除数据,最后一旦确定了整个大小,就调用真正的 API,但这意味着从 Lua 对某些 C 函数的大量调用,而不是首选,因为我想要性能.

将这些大数据传递给 C 的最佳方法是什么?(我考虑过写入文件并传递文件名,但这不是首选,我真的想要直接内存传递)

4

3 回答 3

7

假设 LuaSocket 以字符串的形式提供数据,那真的很简单。

您的 C 应用程序将直接从 Lua 传递字符串。所以它在 Lua 堆栈上。用于lua_tolstring获取字符串及其大小。这将返回一个指向 Lua 拥有的内存的指针(因此您需要确保它保留在 Lua 堆栈或注册表中或在您使用它的某个地方,以防止 Lua 垃圾收集它)。然后将该字符串+大小传递给您选择的 API。

于 2012-10-21T15:36:38.777 回答
2

在我看来,您不必关心 Lua 堆栈的大小。Lua 堆栈上的大多数(如果不是每个)元素实际上都是堆分配的。如果你使用的是 luasocket,那么你收到的二进制数据已经可以作为 Lua 字符串使用(我猜是 socket:receive 的返回值),所以你没有额外分配任何东西!Lua 堆栈实际上更有可能传递某种引用,因此复制不会发生或非常便宜。要连接您的 C 库,您可以:a) 编写一个 C 绑定 b) 使用外星人 c) luajit 在 99% 的情况下我更喜欢 a)。有几种方法可以做到这一点,但它似乎是一个相当苗条的 C API,所以我会在没有任何额外绑定库(如 luabind)的情况下做到这一点。

您可以查看 lua-cjson 源http://www.kyne.com.au/~mark/software/lua-cjson-manual.html。这是 C 绑定的一个很好的例子。

于 2012-10-21T15:36:18.533 回答
1

如果我在你的情况下,我会跳过 luasocket 并只使用 C/C++ 套接字库。

由于无论如何处理都将在 C/C++ 中完成,因此使用 luasocket 简化了(一点)套接字处理,但代价是接收数据和 C/C++ 二进制数据处理库之间的接口(显着)复杂化。

使用 C/C++ 套接字库会使套接字处理更加困难(但不多),而到处理库的数据传输将是微不足道的。

于 2012-10-23T10:31:11.713 回答