4

私はLua関数を持っています。この関数は、nが与えられると、1からnまでの系列のすべての順列を生成し、各一意の系列をテーブル形式でコンテナーテーブル内に格納します。

この生成されたテーブルのサイズは非常に急速に大きくなります(そして必然的にそうなります)。n = 11を試してみると、スクリプトは数秒間実行されてから、「lua:メモリ不足」に失敗します。16GBの物理RAMがありますが、Windowsタスクマネージャーでパフォーマンスモニターを監視すると、実行時にRAMが消費されるのを監視でき、スクリプトがメモリエラーで終了するまでに最大で約20%しか取得できません。

私が向かわなければならない方向のように見えるこの投稿を見つけました:Luaのプロセスの記憶

私はLua.exeでスクリプトを実行しているので、WindowsがLua.exeに割り当てるメモリの量に制限されていると想定しています。この金額を増やすことはできますか?C#ラッパープログラムを使用して、Luaスクリプトを単純に実行できますか(メモリ割り当ての制限が高くなる/低くなるという考え)?それとも私は間違った方向を見ていますか?


4

3 に答える 3

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
于 2012-09-04T11:05:52.320 に答える
4

フィンの答えと同じように、ここに別の順列ジェネレータがあります。

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-04T16:24:52.790 に答える
1

LuaのC++側でメモリマップトファイルを使用することもできます。このファイルには、 LuaBridgeを介してAPIを提供できます。

アップデート1:メモリマップトファイルの代わりにNoSQLデータベースを使用することもできます

于 2012-09-04T08:25:14.540 に答える