Перенаправление вывода файла в Linux - PullRequest
2 голосов
/ 17 февраля 2011

У меня есть две программы A и B .Я не могу изменить программу A - я могу запустить ее только с некоторыми параметрами, но я сам написал B и могу изменить ее так, как мне нравится.

Программа A работает в течение длительного времени (20-40 часов) и в течение этого времени выдает вывод в файл , поэтому ее размер постоянно увеличивается и может быть огромнымв конце пробега (вроде 100-200 гб).Программа B затем читает файл и вычисляет некоторые вещи.Особое свойство файла заключается в том, что его содержимое не коррелировано: я могу разделить файл пополам и выполнить вычисления для каждой части независимо, поэтому мне не нужно хранить все данные сразу:Я могу вычислить по первой части, затем выбросить, рассчитать по второй и т. Д.

Проблема в том, что у меня недостаточно места для хранения таких больших файлов.Интересно, можно ли как-то передать данные с A на B , не сохраняя все данные сразу и не создавая огромных файлов.Можно ли сделать что-то подобное?

Заранее спасибо, это важно для меня, Роман.

Ответы [ 3 ]

3 голосов
/ 17 февраля 2011

Если программа A поддерживает это, просто труба.

A | B

В противном случае используйте fifo.

mkfifo /tmp/fifo
ls -la > /tmp/fifo &
cat /tmp/fifo

EDIT: отрегулируйте размеры буфера с помощью ulimit -p, а затем:

cat /tmp/fifo | B
1 голос
/ 17 февраля 2011

вы можете использовать socat , который может взять стандартный вывод и передать его в сеть, получить из сети и передать в стандартный вывод

именованный или безымянный канал имеет проблему с небольшим (4k?) Буфером ... это означает, что слишком много переключений контекста процесса, если вы пишете multi gb ...

Или, если вы достаточно предприимчивы ... вы можете LD_PRELOAD a в процессе А и перехватывать вызовы открытия / записи, чтобы делать что угодно ..

1 голос
/ 17 февраля 2011

Возможен конвейерный вывод одной программы в другую.

Чтение здесь , чтобы узнать синтаксис и ноу-хау конвейерной обработки Unix.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...