如何管理大字符串
How to manage large strings
在最近对我的 ESP8266 的测试中,我遇到了内存限制。
我有一个简单的 http 服务器,它为 ESP8266 周围可用的 AP json 提供服务。
function incoming_connection(conn, payload)
conn:send('HTTP/1.1 200 OK\n')
conn:send('Content-Type: application/json\n\n')
conn:send(tableToJson1(currentAPs))
end
当我在家时,在巴黎,AP 列表可能很长,然后我达到有效负载的最大大小。
为了避免这种内存混乱,我想将我的 json 分成几块,然后一个接一个地发送。
我写了这个:
function splitString(str, maxlen)
local t = {}
for i=1, math.ceil(string.len(str)/maxlen) do
t[i] = string.sub(str, (i-1)*maxlen+1, i*maxlen)
end
collectgarbage()
return t
end
然后尝试用这个测试函数:
function genstr(len)
local s=""
for i=1,len do
s=s.."x"
end
return s
end
for k,v in pairs(splitString(genstr(2000))) do print(v) end
部分测试结果:
Length of generated string + Length of string chunks + Result
1500 + 100 + OK
1500 + 200 + OK
2000 + 100 + Crashes after 8 lines
2000 + 200 + Crashes after 4 lines
我似乎达到了大约 1500 字节的内存限制。
如果超过此限制,您有什么建议?
问题可能出在 genstr
,而不是 splitString
。
Lua中的字符串是不可变的,在genstr
中,每个s=s.."x"
循环生成一个新字符串。
for i=1,len do
s=s.."x"
end
相反,您可以使用内置 string.rep
(or, for more complicated cases, table.concat
) 来生成测试字符串。
在最近对我的 ESP8266 的测试中,我遇到了内存限制。
我有一个简单的 http 服务器,它为 ESP8266 周围可用的 AP json 提供服务。
function incoming_connection(conn, payload)
conn:send('HTTP/1.1 200 OK\n')
conn:send('Content-Type: application/json\n\n')
conn:send(tableToJson1(currentAPs))
end
当我在家时,在巴黎,AP 列表可能很长,然后我达到有效负载的最大大小。
为了避免这种内存混乱,我想将我的 json 分成几块,然后一个接一个地发送。
我写了这个:
function splitString(str, maxlen)
local t = {}
for i=1, math.ceil(string.len(str)/maxlen) do
t[i] = string.sub(str, (i-1)*maxlen+1, i*maxlen)
end
collectgarbage()
return t
end
然后尝试用这个测试函数:
function genstr(len)
local s=""
for i=1,len do
s=s.."x"
end
return s
end
for k,v in pairs(splitString(genstr(2000))) do print(v) end
部分测试结果:
Length of generated string + Length of string chunks + Result
1500 + 100 + OK
1500 + 200 + OK
2000 + 100 + Crashes after 8 lines
2000 + 200 + Crashes after 4 lines
我似乎达到了大约 1500 字节的内存限制。
如果超过此限制,您有什么建议?
问题可能出在 genstr
,而不是 splitString
。
Lua中的字符串是不可变的,在genstr
中,每个s=s.."x"
循环生成一个新字符串。
for i=1,len do
s=s.."x"
end
相反,您可以使用内置 string.rep
(or, for more complicated cases, table.concat
) 来生成测试字符串。