Труба против временного файла - PullRequest
27 голосов
/ 08 августа 2011

Есть большая разница в производительности между:

  • Процесс A записывает данные во временный файл и процесс B читает этот файл
  • Процесс A записывает данные в канал и процесс Bчтение из этого канала

Мне любопытно узнать ответ для Windows и * nix.

РЕДАКТИРОВАТЬ: я должен был спросить: устраняет ли разница буферный кешмежду временным файлом и каналом?

Ответы [ 4 ]

31 голосов
/ 08 августа 2011

Одно большое отличие состоит в том, что в конвейере процессы A и B могут выполняться одновременно, поэтому B начинает работать с выходом из A до того, как A завершит его производство.Кроме того, размер канала ограничен, поэтому A не сможет выдавать гораздо больше данных, чем потребляет B;будет сделано ожидание, пока B не догонит.

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

9 голосов
/ 08 августа 2011

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

С точки зрения производительности память быстрее диска (почти всегда). Это должно быть в целом верно для всех операционных систем.

Единственный случай, когда использование временного файла действительно имеет смысл, - это если процесс B должен проверять данные в несколько проходов (например, определенные виды кодирования видео). Для этого использования весь поток данных должен быть буферизован, и если данных будет достаточно, это, вероятно, сведет на нет преимущество в памяти. Поэтому для многопроходных (связанных с поиском) операций используйте временный файл.

2 голосов
/ 08 августа 2011

Если мое понимание каналов полностью отсутствует, ответ будет ДА.

Запись во временный файл включает в себя доступ к диску и связанные с ним служебные данные.

Запись в канал,и чтение из него происходит в памяти.Гораздо быстрее.

0 голосов
/ 14 мая 2015

Я думал, что практический ответ может помочь.Я оптимизирую скорость скрипта, который я использую, который имеет около 4 шагов.Я настроил его, чтобы использовать методы трубопровода и без него.Это под Windows 7 64-бит.

Я получил 3% замедления за неиспользование трубопровода.Для меня это того стоит, потому что теперь я могу останавливаться между каждым шагом и обновлять заголовок окна, чего я не мог, когда все это было одной командой.

Лично я возьму эти 3% за заголовки окон.

Для любопытства я собираю файл размером> 20M, затем передаю его в специализированный сценарий perl, который изменяет результаты, затем сортирует их с помощью окон, встроенных в SORT.EXE, и затем удаляет их с помощью UNIQ cygwin.EXE, затем повторно получая те же результаты, чтобы получить основанный на ANSI grep-result-color.Большая часть времени проводится на этапе сортировки.

...