2

У меня есть несколько сложный вопрос. Я хочу передать результат от одной команды к другой, но так как я работаю в системе с ограниченной памятью, я хочу убедиться, что канал не будет использовать слишком много этого. Но я не хочу, чтобы он сломался, когда достигнет предела, просто переключитесь на использование диска в качестве временного файла.

Вариант использования заключается в следующем. Я загружаю большой файл, используя curl или wget. Я передаю результат в другую программу (фактически, в именованный канал, но этот именованный канал немедленно передается другой команде). Если что-то идет хорошо, вторая команда может потреблять ввод быстрее, чем curl может вывести его (загрузка медленнее, чем обработка второй команды).

Но иногда что-то идет не так, и второй команде нужно некоторое время, чтобы начать ее использовать. Возможно, в конечном итоге это произойдет, но поскольку для этой второй команды требуется немного оперативной памяти, а у меня ограничен этот ресурс, я хочу переключиться на запись на диск, если канал начинает использовать больше, скажем, 200 МБ оперативной памяти.

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

Есть ли решение для такой глупой проблемы?

1 ответ1

0

Ваш вопрос похож на этот: используйте дисковый буфер между каналами , где ответом является mbuffer -T /path/to/file . Разница в том, что у вас идея объединить буферы:

Я хочу переключиться на запись на диск, если канал начинает использовать больше, скажем, 200 МБ ОЗУ.

Подключите два буфера, как это:

feeder | mbuffer -T /path/to/file -m 2G | mbuffer -m 200M | consumer

Данные будут перемещаться настолько далеко, насколько это возможно, поэтому буфер памяти объемом 200 МБ будет заполнен первым (если вообще когда-либо). Только тогда дисковый буфер на 2 Гбайт начнет хранить данные.

Заметки:

  • Похоже, файл размещается в полном размере в самом начале. Если на устройстве не осталось места, вся труба рано выйдет из строя. Это вводит некоторую начальную задержку все же.

  • В моих тестах первый mbuffer записывает в файл, даже если второй читает сразу из канала. Я думаю, что первый может передать данные, не касаясь файла; но это не так, и весь канал ограничен скоростью диска, даже если дисковый буфер вообще не используется.

Всё ещё ищете ответ? Посмотрите другие вопросы с метками .