Что касается # 2: большинство современных файловых систем используют подход btree для управления количеством каталогов и узлов данных в современных огромных HD. Как и у всех btrees, их иногда нужно сбалансировать. Пока это происходит, никаких изменений не должно произойти, поэтому система блокируется. Как правило, это не имеет большого значения из-за огромного объема кэша ОС, но вы находитесь в критическом случае, когда это больно.
Что вы можете с этим поделать? Есть два подхода:
Используйте сокеты для связи и сохранения последних N кадров в ОЗУ (т.е. никогда не записывайте их на диск или не используйте независимый процесс для записи на диск).
Не записывать новый файл, перезаписать существующий файл. Так как местоположение всех блоков данных известно заранее, во время записи в FS не будет повторной регистрации. Это также будет немного быстрее. Поэтому идея состоит в том, чтобы создать огромный файл или использовать необработанный раздел, а затем перезаписать его. Когда вы дойдете до конца файла, вернитесь к началу и повторите.
Недостатки:
При подходе № 1 вы можете потерять кадры. Кроме того, вы должны быть абсолютно уверены, что все клиенты могут читать и обрабатывать данные достаточно быстро, иначе сервер может заблокироваться.
С помощью # 2 вы должны найти способ сообщить читателям, где находится текущий «конец файла».
Так что, возможно, лучше использовать смешанный подход:
- Создать огромный файл (несколько ГБ). Если одного файла недостаточно, создайте несколько.
- Открыть розетку
- Запишите данные в файл. Если вы достигли конца файла, найдите позицию 0 и продолжайте запись в нее (например, циклический буфер).
- Сброс данных
- Отправка начала и количества новых данных читателям через сокет
Рассмотрите возможность использования файлов, отображаемых в память; это сделает все немного проще.