如何增加内存来处理超大Lua表

Con*_*nor 4 windows lua memory-management

我有一个Lua函数,给定n,生成从1到n的系列的所有排列,并以表格形式将每个唯一系列存储在容器表中.

这个生成的表的大小非常快(并且必然如此).关于我尝试n = 11的时间,脚本将运行几秒钟,然后失败到"lua:没有足够的内存".我有16GB的物理RAM,但是在Windows任务管理器中观察性能监视器可以让我在运行时看到ram被消耗,并且在脚本以内存错误结束之前它只会达到大约20%.

我发现这篇文章看起来像我需要的方向:Lua中一个进程的记忆

由于我使用Lua.exe运行我的脚本,我假设我仅限于Windows为Lua.exe分配的内存量.我可以增加这笔金额吗?我可以使用C#包装器程序来简单地运行Lua脚本(这个想法是它将具有更高/更少限制的内存分配)?还是我在朝错误的方向看?


fin*_*nnw 8

您需要提前存储所有排列吗?您可以在运行中生成它们.

例:

local function genPerm(self, i)
  local result = {}
  local f = 1
  for j = 1, self.n do
    f = f * j
    table.insert(result, j)
  end
  for j = 1, self.n-1 do
    f = f / (self.n + 1 - j)
    local k = math.floor((i - 1) / f)
    table.insert(result, j, table.remove(result, j+k))
    i = i - k * f
  end
  return result
end

local function perms(n)
  return setmetatable({n=n}, {__index=genPerm})
end

local generator = perms(11)
for _, i in ipairs {1, 42, 1000000, 39916800} do
  print(table.concat(generator[i], ','))
end
Run Code Online (Sandbox Code Playgroud)