2015-10-12 5 views
3

В недавнем тесте моего ESP8266 я столкнулся с ограничением памяти.Как управлять большими строками

У меня есть простой HTTP-сервер, который служит json из AP, доступного вокруг ESP8266.

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 байт.

Каким будет ваш совет преодолеть этот предел?

+0

Заголовки в идеале должны заканчиваться на '\ r \ n', а не' \ n' – hjpotter92

ответ

4

Проблема, вероятно, в genstr, а не splitString.

Строки в Lua неизменяемы, в genstr, новая строка генерируется каждым s=s.."x" в цикле.

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

Вместо этого, вы можете использовать встроенный в string.rep (или, для более сложных случаев, table.concat) для создания тестовой строки.

+0

Правильный андер, то есть – bixente57

+0

Также [Lua Ropes] (http://lua-users.org/wiki/LuaRopes). –

+0

Другая идея: сначала напишите полученный текст, чтобы отправить его, а затем отправить его. –

Смежные вопросы