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

时间:2012-09-04 04:29:31

标签: windows memory-management lua

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

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

我发现这篇帖子看起来像我需要的方向:memory of a process in Lua

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


3 个答案:

答案 0 :(得分: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

答案 1 :(得分:4)

与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)

答案 2 :(得分:0)

您可以在Lua的C ++端使用memory-mapped file,您可以通过LuaBridge为其提供API。

更新1:内存映射文件的替代方案可能是NoSQL数据库