如何增加内存以处理超大的Lua表。

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

由于生成的表格大小非常快速地变大(必然如此)。大约在尝试 n=11 时,脚本会运行几秒钟,然后失败并显示 "lua:内存不足"。我有 16GB 的物理内存,但在 Windows 任务管理器中观察性能监视器可以让我在运行时观察内存被消耗,仅在脚本以内存错误结束之前,内存才达到约 20%。

我找到了这篇帖子,看起来是我需要前进的方向:在 Lua 中使用进程内存

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

点赞
用户847349
用户847349

,你或许可以在 Lua 的 C++ 端使用内存映射文件,然后可以通过LuaBridge提供 API 。

更新 1:另一种替代内存映射文件的方法可能是 NoSQL 数据库。

2012-09-04 08:25:14
用户12048
用户12048

你需要提前存储所有的排列吗?你可以实时生成它们。

例如:

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
2012-09-04 11:05:52
用户107090
用户107090

与 finn 的回答类似,这里有另一个排列生成器:

local function perms(a,lo,hi,f)
    if lo>hi then f(a) end
    for i=lo,hi do
        a[lo],a[i]=a[i],a[lo]
        perms(a,lo+1,hi,f)
        a[lo],a[i]=a[i],a[lo]
    end
end

local function gperms(n,f)
    local a={}
    for i=1,n do a[i]=i end
    perms(a,1,#a,f)
end

local function show(a)
    for i=1,#a do io.write(a[i],' ') end
    io.write('\n')
end

gperms(4,show)
2012-09-04 16:24:52