Правильная запись потока байт в файл на С.
От: homecat  
Дата: 21.01.13 10:39
Оценка:
Принимаю пакеты по сети и сразу пишу в файл

rec1 = recv(socket1,buff1,sizeof(buff1),0);
write(foutput, buff1, rec1);

пакеты по 1400 байт буфер 1500
уже на 10мбит запись на диск начинает тормозить прием данных
можно буфер поставить больше тогда на малой скорости все так же а при возрастании задержек записи в буфер набирается по 2-3 пакета но все равно как то это не аккуратно. Я рассчитывал что система сама будет кэшировать запись и сбрасывать потом большими блоками но как будто этого не происходит. Мне самому нужно набирать побольше в какой то буфер или что? Как вообще делают буферизацию записи скажем блоками по 1Мбайт. Приведите плиз пример реализации на Си без ++. Что то у меня не получается рабочий код.

22.01.13 03:00: Перенесено модератором из 'C/C++' — Кодт
Re: Правильная запись потока байт в файл на С.
От: cruelbob  
Дата: 21.01.13 12:29
Оценка:
Здравствуйте, homecat, Вы писали:

H>Принимаю пакеты по сети и сразу пишу в файл


H>
H>rec1 = recv(socket1,buff1,sizeof(buff1),0);
H>write(foutput, buff1, rec1);
H>

H>пакеты по 1400 байт буфер 1500
H>уже на 10мбит запись на диск начинает тормозить прием данных
H>можно буфер поставить больше тогда на малой скорости все так же а при возрастании задержек записи в буфер набирается по 2-3 пакета но все равно как то это не аккуратно. Я рассчитывал что система сама будет кэшировать запись и сбрасывать потом большими блоками но как будто этого не происходит. Мне самому нужно набирать побольше в какой то буфер или что? Как вообще делают буферизацию записи скажем блоками по 1Мбайт. Приведите плиз пример реализации на Си без ++. Что то у меня не получается рабочий код.

Сделать очередь?
Twitter — http://twitter.com/Cruelbob
Блог — http://cruelbob.blogspot.ru/
Мыло — vlad.kolotvin@gmail.com
Re[2]: Правильная запись потока байт в файл на С.
От: Kernan Ниоткуда https://rsdn.ru/forum/flame.politics/
Дата: 21.01.13 13:42
Оценка:
Здравствуйте, cruelbob, Вы писали:

C>Сделать очередь?

А что, если приходящие данные не получится быстро записывать в файл и как результат очередь будет расти бесконечно при условии, что поток данных постоянный.
Sic luceat lux!
Re[3]: Правильная запись потока байт в файл на С.
От: cruelbob  
Дата: 21.01.13 13:58
Оценка:
Здравствуйте, Kernan, Вы писали:

K>Здравствуйте, cruelbob, Вы писали:


C>>Сделать очередь?

K>А что, если приходящие данные не получится быстро записывать в файл и как результат очередь будет расти бесконечно при условии, что поток данных постоянный.

Эмм, подождать пока данные запишутся на диск и продолжить принимать? В случае если так нельзя, то единственный вариант это использовать более быстрый жесткий диск.
Twitter — http://twitter.com/Cruelbob
Блог — http://cruelbob.blogspot.ru/
Мыло — vlad.kolotvin@gmail.com
Re: Правильная запись потока байт в файл на С.
От: okman Беларусь https://searchinform.ru/
Дата: 21.01.13 18:28
Оценка:
Здравствуйте, homecat, Вы писали:

H>Принимаю пакеты по сети и сразу пишу в файл


H>
H>rec1 = recv(socket1,buff1,sizeof(buff1),0);
H>write(foutput, buff1, rec1);
H>

H>пакеты по 1400 байт буфер 1500
H>уже на 10мбит запись на диск начинает тормозить прием данных

Для таких случаев можно использовать кэширующую обертку над функцией записи на диск.
То есть, данные пишутся в фиксированного размера буфер, а при его заполнении скидываются
на диск в один присест. Размер буфера следует подбирать экспериментально, но обычно
его нет смысла делать большим нескольких десятков-сотен килобайт.

В дополнение к этому, функцию записи можно вызывать в асинхронном режиме (Overlapped I/O,
если мы говорим о Windows), сразу возобновляя получение данных по recv, без ожидания.
В этом случае средние издержки на дисковые операции должны быть минимальны.

Есть и другие ухищрения, но 10Мб — не та цифра, где гнаться за ними имеет смысл.
Re: Правильная запись потока байт в файл на С.
От: BulatZiganshin  
Дата: 22.01.13 17:05
Оценка:
Здравствуйте, homecat, Вы писали:

H>write(foutput, buff1, rec1);

H>пакеты по 1400 байт буфер 1500

1. write не буферизует, используй fwrite
2. оптимальный размер буфера в районе 1 мб, по умолчанию там гораздо меньше
3. если хочешь ещё быстрее — выдели отдельный поток для write
Люди, я люблю вас! Будьте бдительны!!!
 
Подождите ...
Wait...
Пока на собственное сообщение не было ответов, его можно удалить.