?

Log in

Как рассчитать буфер - C/C++ Developers [entries|archive|friends|userinfo]
C/C++ Developers

[ userinfo | livejournal userinfo ]
[ archive | journal archive ]

Как рассчитать буфер [Jan. 3rd, 2014|06:27 pm]
C/C++ Developers

ru_c

[agent_0007]
Делаю GET запрос к серевру, но он все время отвечает ответами разной длины.
Как праильно расчитывать буфер для результата GET запроса чтобы не выходить за верхний предел, скажем свыше 100кб ответа но и сразу не выделать память под ожидание этих 100кб?

P.S. Буду рад ссылкам "для чайников"

UPD: Пока сделал вот так: http://pastebin.com/Jk5JcwEG но работает крайне медленно. Подскажите что я делаю не так?
linkReply

Comments:
[User Picture]From: alll
2014-01-07 02:24 am (UTC)
С одной стороны, если ОС с виртуальной памятью, то нет особого смысла не выделять сразу 100500 памяти под буфер - физическая память всё-равно не будет выделятся ОС, пока нет обращений к странице виртуальной памяти. С другой стороны, в ответ на запрос вполне могут прилететь данные размером больше всей имеющейся памяти, так что читать результат всё-равно придётся по частям.
(Reply) (Thread)
[User Picture]From: eddy_em
2014-01-07 06:34 am (UTC)
Одного килобайта за глаза хватит.
(Reply) (Thread)
[User Picture]From: fromhearttosun
2014-01-08 11:24 am (UTC)
>Подскажите что я делаю не так?
При каждом обращении перераспределяешь память? (только предположение).
Попробуй перераспределять память только для расширения буфера (т.е. если места под строку не хватает, то перераспределяем память, в противном случае используем часть существующего буфера).
(Reply) (Thread)
[User Picture]From: agent_0007
2014-01-08 04:42 pm (UTC)
А сколько по размеру должен быть начальный буфер?
Пока я предполагал так считали 1024 байта, выделили под них память. Если считали еще, то сделали реалок и перевыделили память под 2*1024 и так пока не закончится ответ на запрос.
Но вот встает еще такая проблема - если в качестве прикола сунуть в ответ на запрос фаил метров 100 то получается ерунда...
(Reply) (Parent) (Thread)
[User Picture]From: fromhearttosun
2014-01-08 06:07 pm (UTC)
Теоретически можно подсчитывать какое-нибудь оптимальное значение (медианное, наверное) и держать размер буфера вблизи него, т.е. ниже не режем, а вот если пришло что-то больше, то единовременно расширяем буфер, а при следующем запросе снова урезаем до этого оптимального значения. Но на практике это может оказаться слишком сложным решением.

Проще, наверное, сделать два буфера - один фиксированный, размером в 1 КБ (как тут выше советовали), для небольших запросов, а второй - динамический, для всего, что не влезает в КБ (и не забывать его чистить своевременно).
(Reply) (Parent) (Thread)