Труба против временного файла
Есть большая разница в производительности между:
- Процесс A записывает во временный файл, а процесс B читает этот файл
- Процесс A записывает в канал, а процесс B читает из этого канала
Мне любопытно узнать, что ответ для Windows и *nix.
РЕДАКТИРОВАТЬ: я должен был спросить: устраняет ли буферный кэш разницу между временным файлом и конвейером?
4 ответа
Одно большое отличие состоит в том, что с конвейером процессы A и B могут выполняться одновременно, так что B начинает работать с выходом из A до того, как A завершит его производство. Кроме того, размер канала ограничен, поэтому A не сможет выдавать гораздо больше данных, чем потребляет B; это будет сделано, чтобы ждать B, чтобы нагнать.
Если объем данных большой, то запись во временный файл включает в себя активность диска, даже если только для создания, а затем уничтожения файла. Данные вполне могут оставаться в буферных пулах в памяти - поэтому там нет дискового ввода-вывода - даже для удивительно больших файлов. Запись в канал "никогда" подразумевает запись на диск.
Большая разница в том, что первый метод на самом деле использует хранилище на диске, тогда как канал будет использовать память (если вы не станете действительно педантичны и не начнете думать о пространстве подкачки).
С точки зрения производительности, память быстрее, чем диск (почти всегда). Это должно быть в целом верно для всех операционных систем.
Единственный случай, когда использование временного файла действительно имеет смысл, - это если процесс B должен проверять данные в несколько проходов (например, определенные виды кодирования видео). Для этого использования весь поток данных должен быть буферизован, и если данных будет достаточно, то это, вероятно, сведет на нет преимущество в памяти. Поэтому для многопроходных (связанных с поиском) операций используйте временный файл.
Если я не понимаю, что такое трубы полностью за стеной, ответ - ДА.
Запись во временный файл включает в себя доступ к диску и связанные с ним служебные данные.
Запись в канал и чтение из него происходит в памяти. Намного быстрее.
Я думал, что практический ответ может помочь. Я оптимизирую скорость скрипта, который я использую, который имеет около 4 шагов. Я настроил его, чтобы использовать методы трубопровода и без него. Это под Windows 7 64-битной.
Я получил 3% замедления за то, что не использовал трубопроводы. Для меня это того стоит, потому что теперь я могу останавливаться между каждым шагом и обновлять заголовок окна, чего я не мог, когда все это было одной командой.
Лично я возьму эти 3% для заголовков окон.
Для любопытства я копирую файл размером>20M, затем передаю его в специализированный Perl-скрипт, который изменяет результаты, затем сортирует их с помощью окон, встроенных в SORT.EXE, затем удаляет их с помощью UNIQ.EXE cygwin, затем повторно grepping те же самые результаты, чтобы получить основанный на ANSI grep-result-color. Большая часть времени проводится на этапе сортировки.