Warning: file_get_contents(/data/phpspider/zhask/data//catemap/4/string/5.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
String 如何管理大型字符串_String_Performance_Lua_Esp8266_Nodemcu - Fatal编程技术网

String 如何管理大型字符串

String 如何管理大型字符串,string,performance,lua,esp8266,nodemcu,String,Performance,Lua,Esp8266,Nodemcu,在最近的一次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列表可以很长,

在最近的一次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

相反,您可以使用内置的(或者,对于更复杂的情况,可以使用内置的)来生成测试字符串。

正确答案,您可以考虑另一个想法:首先将结果文本写入flash,然后发送。理想情况下,标题应以
\r\n
结尾,而不是
\n