在Lua中使用大型userdata实现有效的垃圾回收

我已经使用Lua(C API)实现了解决量子力学问题的代码。它将量子力学运算符和波函数添加到脚本语言中。这是很好的一个挑战是波函数userdata可以很大(userdata包含指向1Mb至1Gb之间的数组的指针)。我已经添加了标准的垃圾回收方法,对于简单的情况它们是有效的。

    static int LuaWavefunctionDestroy(lua_State * L)
    {
      WaveFunctionType *psi = (WaveFunctionType*) luaL_checkudata(L, 1, "Wavefunction_Type");
      WaveFunctionFree(psi);
      return 0;
    }

和使用_gc的元方法调用

    static const struct luaL_Reg Wavefunction_meta[] = {
      {"__add", LuaWavefunctionAdd},
      {"__sub", LuaWavefunctionSub},
      {"__mul", LuaWavefunctionMul},
      {"__div", LuaWavefunctionDiv},
      {"__unm", LuaWavefunctionUnm},
      {"__index", LuaWavefunctionIndex},
      {"__newindex", LuaWavefunctionNewIndex},
      {"__tostring", LuaWavefunctionToString},
      {"__gc", LuaWavefunctionDestroy},
      {NULL, NULL}
    };

但如果我现在在Lua中运行以下代码

    for j=1,N do
      for i=j,N do
        psi[j] = psi[j] - ( psi[i] * psi[j] ) * psi[j]
      end
    end

当psi是一个表格(数组),包含少量(10-100)波函数时,内存很快耗尽,因为垃圾收集器无法跟上。

更糟糕的是,我已经注册了几千个字符串和常量(数字),所以完整的垃圾收集需要通过许多变量。

是否有一种方式在特定对象或仅在userdata上运行垃圾收集?

点赞