快速转储从 Lua 传递到 C 的大型表格

为了快速保存包含大型一维数组(数组的数量已知,但元素的数量不固定,每个数组中约有 800,000 个元素)的 Lua 表格,我计划使用以下的 Lua C 绑定方式-

#include "lua.h"
#include "lauxlib.h"
#include <stdio.h>
#include <assert.h>

static int save_table(lua_State *L) {
  assert(L && lua_type(L, -1) == LUA_TTABLE);

  int len, r;
  void *ptr;
  FILE *f;

  lua_pushstring(L, "p");
  lua_gettable(L, -2);
  len = lua_objlen(L, -1);
  ptr = lua_topointer(L, -1);

  f = fopen("p.bin", "wb");
  assert(f);
  r = fwrite(ptr, sizeof(int), len, f);
  printf("[p] 写入了 %d 个元素,共 %d 个元素\n", r, len);
  fclose(f);

  lua_pop(L, 1);

  lua_pushstring(L, "q");
  lua_gettable(L, -2);
  len = lua_objlen(L, -1);
  ptr = lua_topointer(L, -1);

  f = fopen("q.bin", "wb");
  assert(f);
  r = fwrite(ptr, sizeof(float), len, f);
  printf("[q] 写入了 %d 个元素,共 %d 个元素\n", r, len);
  fclose(f);

  lua_pop(L, 1);

  return 1;
}

int luaopen_savetable(lua_State *L) {
  static const luaL_reg Map[] = {{"save_table", save_table}, {NULL, NULL}};

  luaL_register(L, "mytask", Map);
  return 1;
}

以下是 Lua 代码-

-- 包含两个一维数组的示例表格
my_table = {p = {11, 22, 33, 44}, q = {0.12, 0.23, 0.34, 0.45, 0.56}}

require "savetable"
mytask.save_table(my_table)

上述代码生成了两个内容错误的二进制文件,出了什么问题?

PS:我使用的是 Lua 5.1。我不确定这是否是转储大型 Lua 表格的最快方法。欢迎提出建议。

点赞