“function or expression needs too many registers” 阻碍了把数据序列化成代码,怎样绕过比较好? return {1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,{1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,{1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,{1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,{1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,{1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,0}}}}}} 『More Lines』
序列化大数组不要这么做,非常低效。因为运行的时候构造大表就是很低效的。而且生成的 bytecode 也很浪费空间。
比较简单的方法是把数据块直接打包成字符串常量,然后生成 string.unpack 解码。 - 回复 | (2996) | 云风 | 2018-01-23 02:37:59
不是要序列化数字组成的数组,而是序列化一个非特定结构的table,所以不能靠string.unpack解决。上边的数据是个链表,把数字1替换成字符串或表也一样效果。不需要很大的内容,比如用一个表表达一个目录信息,里边有总共两百多个文件文件夹就可能出错。我是在测试自己的序列化库时发现这个错误:写一个随机生成树来测试自己的序列化库,最小情况下只产生2k大小的文件就触发了这个错误,10k以内文件大概万分之一概率。按发明人自己的说法,lua以前处理几M数据都很平常,以我的机器为例,一秒能读4-10M的储存数据源码,但2k大小文件能触发错误,离性能瓶颈还远。
一个比较完整的展示:
local function showbug(n) local node='{' for i=1,n do node=node..i..',' end local nest=math.floor((256+n-1)/n) --总共不到256+n个元素就能触发bug local src='' for i=1, nest do src=node..src..'}' end local suc,errmsg=load('return '..src) if not suc then print(n,nest,errmsg) endend
for i=5,40 do showbug(i)end
而且luajit就没这个错误。我加不进lua.org的bug邮件列表,在lua.org上看到您汇报的bug比较多,可否帮忙把这个错误提一下?
名字: 自动排版 密码: |
限制/bug 的问题你可以自己去 lua mailing list 里去提,我不是 lua 的维护者。
你可以用 local tmp = {} ; tmp[1] = 1, tmp[2] = 1 , ... 这样来生成。对于连续的数字,可以打包成字符串,再用 string.unpack 。简单说,想个办法做紧凑的序列化,然后把序列化结果以字符串保存,调用反序列化解开,这样要高效的多。 - 回复 | (3000) | 云风 | 2018-01-28 07:57:04