2019年11月29日金曜日

Luaのテーブル上限

luaのスクリプト形式で永続化情報を出力して、luaに再読み込みさせると
「function at line 1 has more than 65536 constants」
というエラーが返ってきた。

ネットでテーブルの上限を調べてみても、メモリ次第という答えしか見つからなかった。

テストプログラムで実験してみると、配列の要素数、キーの数には制限がなさそうだけど
テーブル要素が65536を超えると、前述のエラーが出る。

o = {
{a=1},
{a=1},
{a=1},
.
. 全部で65536個
.
{a=1},
}
エラー。
oと中身の65536個を足すと65537個になる。中身が65535個ならエラーにならない。

1変数内の最大数が65536までなのかと思い下記のコードを実行
o = {
{a=1},
.
. 全部で35535個
.
{a=1},
}
o2 = {
{a=1},
.
. 全部で30000個
.
{a=1},
}
エラー。
oと中身の35535個、o2と中身の30000個で65537個。
oの中身を35534個にすればエラーにならない。

グローバルスコープで宣言できる数が、65536までらしい。
function x()
o = {
{a=1},
.
. 全部で65535個
.
{a=1},
}
end
g = {
{a=1},
.
. 全部で65533個
.
{a=1},
}
OK。

x関数のスコープ内はoと中身で65536個、グローバルスコープはgと中身で65534個+関数で65536個と数えるらしい。関数は2個扱い?
gの要素数を65534個にするとエラーになる。
x関数内にo2を増やしても、g側の要素数には影響しなかった為、x関数内の変数の数は関係ないようだ。

関数を増やしてみる。
function x()
.
.
.
end
function y()
.
.
.
end
g = {
{a=1},
.
. 全部で65531個
.
{a=1},
}
OK。

x関数、y関数、gと中身の65531個で65536個。
gの中身を65532個にするとエラーになる。
関数を3個に増やした場合、gの要素を65529個にすればエラーにならない。
やはり関数は2個と数えるようだ。

関数を要素に入れてみる。
g = {
{a=1},
.
. 全部で65533個
.
{a=1},
f = function() return {} end
}
エラー。
なぜか、関数を要素に入れる場合は3個で数えるようだ。
gの要素を65532個にするとエラーでなくなる。

関数を2つ入れてみる。
g = {
{a=1},
.
. 全部で65531個
.
{a=1},
f = function() return {} end,
f2 = function() return {} end
}
なぜか、2つ目は2個でエラーにならない。
3つ目も同様で2個扱い。
最初の関数定義だけは、3つで数えるらしい。

最後定義されている関数を入れてみる。
function x() return {} end
g = {
{a=1},
.
. 全部で65531個
.
{a=1},
f = x
}
定義されている関数を追加する場合は1つ目の関数だとしても2つ計算となった。