О, Коллективный разум!Вкратце, проблема такова. Я сейчас написал класс, который нужен будет для передачи/приема информации по TCP, всё замечательно работает. Но задался вопросом: у меня буферы для отправляемых и получаемых сообщений создаются с помощью new. Точнее, в классе они не создаются, но программа должна их предоставить. И тут я осознал, что пересылаемые объемы данных могут быть и немаленькими - т.к. речь идет о передаче файлов, характерный размер которых равен 250-500 Кил, но может достигать и 2-3 метров.
Вот насколько хорошо будет если я сделаю
BYTE *buf = new BYTE[2097152]
к примеру? Не поплохеет ли машинке?Под "машинкой" понимаю 2 крайности: обычная рабочая ВыньXP с одной стороны (сотни метров оперативки) и mini-pc с FreeBSD с несколькими десятками метров оперативки :).
Соответственно выбор такой: либо осознать, что ничего страшного не будет и перед отправкой файлов отображать их в оперативку целиком, либо написать дополнительные методы для пересылки файлов, которые будут непосредственно с хардом работать.
Как думаете, что лучше?P.S. пересылать файлы блоками - не советуйте, класс это сам по себе делает, и мне не хочется его уже менять. Нужно лишь понять, откуда ему лучше подсовывать метровые объёмы данных :)
P.P.S. полевые испытания на 50 килобайтах через new показали что все ок - никто даже не поперхнулся.Пасиба!
>BYTE *buf = new BYTE[2097152]
>к примеру? Не поплохеет ли машинке?Как обычно - смотря какой машинке и смотря в каких условиях.
>Под "машинкой" понимаю 2 крайности: обычная рабочая ВыньXP с одной
>стороны (сотни метров оперативки) и mini-pc с FreeBSD с несколькими >десятками метров оперативки :).Если таких процессиков одновременно пяток запустится, может наступить
полный @#$%:).>Соответственно выбор такой: либо осознать, что ничего страшного не
>будет и перед отправкой файлов отображать их в оперативку целиком,
>либо написать дополнительные методы для пересылки файлов, которые
>будут непосредственно с хардом работать.
>Как думаете, что лучше?
>Выражение "непосредственно с хардом" означает, видимо, использование
буфера ограниченного и фиксированного размера с постепенным
подчитыванием и записью кусков. В этой связи нижеследующий
PS не вполне понятен.>P.S. пересылать файлы блоками - не советуйте, класс это сам по себе
>делает, и мне не хочется его уже менять. Нужно лишь понять,
>откуда ему лучше подсовывать метровые объёмы данных :)>P.P.S. полевые испытания на 50 килобайтах через new показали что все ок
>- никто даже не поперхнулся.
>Смотря сколько таких "испытателей" на одной машине одновременно крутится
:)
>Если таких процессиков одновременно пяток запустится, может наступить
>полный @#$%:).
Ну, в теории, кроме самой ОС на мини-PC будет только один процесс жить. Мой :)
>Выражение "непосредственно с хардом" означает, видимо, использование
>буфера ограниченного и фиксированного размера с постепенным
>подчитыванием и записью кусков. В этой связи нижеследующий
>PS не вполне понятен.
Согласен, слать нужно будет кусками, просто сам класс я делал таковым, чтобы он автоматически при превышении некоторого размера пакета бил его на блоки и пересылал поблочно с квитированием (чтобы ненароком не замусорить буффер TCP на приеме - там во фре, если не ошибаюсь, около 14-15 К). И соответственно если писать нечто специальное для файлов - нужно будет как-то согласовывать блоки файловые и блоки, на которые бъет класс. Один из пунктов, почему не хочется писать что-то новое :).>Смотря сколько таких "испытателей" на одной машине одновременно крутится
>:)
См. выше - адын! :)
Это плохая идея - выделять память под весь файл сразу. Конечно так писать легче, однако подобный подход - прямо приглашение к DoS. А если я, как похой дядька, на вход вашей проги пошлю образ DVD Гига на четыре?
По моему, хорошей идеей будет выделять большой кусок памяти и работать с ним. Либо ограничивать максимальный размер передаваемых файлов.
>Это плохая идея - выделять память под весь файл сразу. Конечно так
>писать легче, однако подобный подход - прямо приглашение к DoS. А
>если я, как похой дядька, на вход вашей проги пошлю образ
>DVD Гига на четыре?
В том-то и вопрос! Что Вас (как плохого дядьку) никто к проге не допустит :)
Речь идет о файлах размером (как писал) под 200-300К, несколько мегабайт - это ну в сосвсем экзотических и маловероятных ситуациях. Это не файлы, которые даёт пользователь, а файлы данных, которые генерит другая прога и у неё, естественно, есть совершенно четкие границы болтливости.
>По моему, хорошей идеей будет выделять большой кусок памяти и работать с
>ним. Либо ограничивать максимальный размер передаваемых файлов.
Идея хорошая - вопрос в том, стоит ли этим заморачиваться, принимая во внимание что ни о каких гигабайтах речи не идет. Там винта такого нету =)
Не буду надоедать советами.Просто посмотри что здесь написано:
17. Переносимость, как она понимается в GNU
http://www.opennet.me/docs/RUS/coding_standard/standard-17.html===
Вы можете считать разумным использование мегабайта памяти. Не старайтесь уменьшать использование памяти, если Вы не подходите к этому барьеру. Если Ваша программа создает сложные структуры данных, стройте их в памяти, и выдайте фатальную ошибку, если malloc вернул ноль.
===А ты к барьеру подошел.