Быстро сбрасывать большие таблицы, передаваемые из Lua в C - PullRequest
0 голосов
/ 01 июля 2018

Чтобы быстро сохранить таблицы Lua, содержащие большие одномерные массивы (количество массивов известно, однако количество элементов не фиксировано. Приблизительно 800 000 элементов в каждом массиве), я планировал использовать привязку 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] wrote %d elements out of %d requested\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] wrote %d elements out of %d requested\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 показан ниже-

-- sample table containg two 1-d array
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. Предложения всегда приветствуются.

...