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

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

这个生成的表的大小非常快(非常快)。 关于我尝试n = 11的时候,脚本会运行几秒钟,然后才会失败“lua:内存不足”。 我有16GB的物理内存,但是在Windows任务pipe理器中观察性能监视器允许我在运行时观察内存使用情况,在脚本以内存错误结束之前,它只能达到20%左右。

我发现这个post看起来像我需要的方向: 在Lua中logging一个进程

由于我用Lua.exe运行我的脚本,我假设我只限于Windows为Lua.exe分配多less内存。 我可以增加这个数额吗? 我可以使用一个C#包装程序来简单地运行Lua脚本(这个想法是,它将有一个更高/更less限制的内存分配)? 还是我看错了方向?


你需要事先存储所有的排列吗? 您可以在运行中生成它们。

例:

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 

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

你也许可以在Lua的C ++端使用内存映射文件 ,为此你可以通过LuaBridge提供一个API。

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