如何管理大字符串

Posted

技术标签:

【中文标题】如何管理大字符串【英文标题】:How to manage large strings 【发布时间】:2016-01-09 20:39:09 【问题描述】:

在最近对我的 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 字节的内存限制。

您对超过此限制有何建议?

【问题讨论】:

标头最好以\r\n结尾,而不是\n 【参考方案1】:

问题可能出在genstr,而不是splitString

Lua 中的字符串是不可变的,在genstr 中,循环中的每个s=s.."x" 都会生成一个新字符串。

  for i=1,len do
    s=s.."x"
  end

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

【讨论】:

正确答案,谢谢 另一个想法:先将生成的文本写入闪存,然后发送。

以上是关于如何管理大字符串的主要内容,如果未能解决你的问题,请参考以下文章

大数据服务之数据管理

如何最好地组织角度翻译中的翻译字符串?

Python - 如何搜索没有空格的大字符串,以查看值是不是存在

如何使用 Axios 将大对象作为字符串发布?

如何把RSA公钥的大整数转为OpenSSH那种字符串

如何从大字符串中一次打印 20 行?