我有一个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脚本(这个想法是它将具有更高/更少限制的内存分配)?或者我是朝错误的方向看的?
答案 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数据库