Последствия небуферизованного файлового ввода-вывода - PullRequest
1 голос
/ 15 июля 2011

Каковы последствия записи больших объемов данных на диск с использованием небуферизованного файлового ввода-вывода (по крайней мере для всего, что выше уровня операционной системы)?

Подробности:

Я пишу сценарий Ruby, который выполнит другой фрагмент кода, захватит его stdout и stderr и запишет их в файл.Очевидно (по крайней мере в Ruby), stderr не буферизирован, а stdout буферизован, что в моем случае приводит к выходу из строя в порядке, поскольку строки stderr печатаются перед некоторыми строками stdout.

Кажется, решение состоит в том, чтобы заставить эту часть кода использовать небуферизованный ввод-вывод (с IO.sync = true).Тем не менее, фрагмент кода, который выполняет мой скрипт, также будет записывать большое количество текста на диск.Поэтому мне интересно, каковы последствия неиспользования буфера Ruby (только буфер ОС и ниже), и, если это важно, как еще я могу обойти проблему упорядочения?

Ответы [ 2 ]

1 голос
/ 15 июля 2011

Небуферизованный ввод / вывод медленнее, чем буферизованный ввод / вывод, когда операции записи имеют малое количество операций и ситуация обратная для операций записи с большим числом операций.В среднем диапазоне от 1000 до 10000 байт на операцию это не имеет большого значения.

Вы также увидите немного лучшую производительность, когда операции выровнены

0 голосов
/ 15 июля 2011

То, что делает IO.sync, включает автоматическую очистку буфера, но не меняет того факта, что он все еще находится в буфере.

Вместо этого вы можете вообще обойти систему буферизации и использовать вместо нее IO # syswrite :

STDERR.syswrite("Look ma, no buffers")

Как сказано в документации, вы должны выбрать буферизованный или небуферизованный файл и придерживаться его, так как смешивание и сопоставление могут вызвать проблемы.

...