3

ESP8266 の最近のテストで、メモリ制限にぶつかりました。

ESP8266 で利用可能な AP の json を提供する単純な http サーバーがあります。

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 をいくつかのチャンクに分割してから、1 つずつ送信したいと考えています。

私はこれを書きました:

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 バイトのメモリ制限に達したようです。

この制限を超えるためのアドバイスは何ですか?

4

1 に答える 1

4

問題はおそらくgenstrではなく にありsplitStringます。

Lua の文字列は不変です。 では、ループ内のgenstrそれぞれによって新しい文字列が生成されます。s=s.."x"

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

代わりに、組み込みstring.rep(または、より複雑な場合はtable.concat) を使用して、テスト文字列を生成できます。

于 2015-10-12T11:34:07.633 に答える