почему команда `less` использует слишком много памяти?

249
rogerdpack

Я использовал меньше, чтобы изучить довольно большой файл (8 ГБ на машине с 4 ГБ ОЗУ). Я сказал ему «прокрутить до конца» ( shift+ G), и он работал довольно долго, а затем был убит за использование оперативной памяти. Я думал less, не будет использовать больше, чем ограниченный объем оперативной памяти, я что-то упустил?

0
У вас есть подходящий раздел подкачки (или файл)? Вы используете 32-битную ОС? AFH 6 лет назад 1
В основном нет обмена. Но не менее ... вы знаете ... не нужно читать весь файл в память, это мой вопросительный знак здесь ... :) rogerdpack 6 лет назад 0
Я думаю, что он, вероятно, читает весь файл в память, что, очевидно, невозможно в вашей системе. Попробуйте создать и включить файл подкачки, как описано [здесь] (https://help.ubuntu.com/community/SwapFaq), но не беспокойтесь, если у вас 32-битная ОС. AFH 6 лет назад 0
Смотрите [эту ссылку] (https://en.wikipedia.org/wiki/Less_ (Unix) #Memory_considerations) для получения информации о требованиях к памяти `less`. AFH 6 лет назад 0
Интересно, что если я использую `-B`, он не использует" неограниченное ОЗУ ", но если я укажу` --buffers = 64`, он использует всю память в системе (несмотря на то, что он читает файл, а не канал) ). В любом случае `-B` исправляет это, не стесняйтесь создавать ответ, я приму это. rogerdpack 6 лет назад 0
FWIW в этом случае он считывал из файла, который «в данный момент изменяется», возможно, из-за этого он ведет себя так, как если бы он был каналом или чем-то еще: | rogerdpack 6 лет назад 0

1 ответ на вопрос

1
AFH

Объем используемой по умолчанию памяти lessзависит от того, читает ли он файл или из канала; Непонятно, что происходит при чтении перенаправленного ввода из файла ( less < FilePathвместо less FilePath).

Следующая выдержка из страницы руководства (в Ununtu 16.04) показывает, как управлять памятью, которая lessвыделяет: -

-b n или --buffers = n

Определяет объем буферного пространства, которое меньше будет использоваться для каждого файла в килобайтах (1024 байта). По умолчанию для каждого файла используется 64 КБ буферного пространства (если файл не является каналом; см. Параметр -B ). Опция -b указывает, что для каждого файла следует использовать n килобайт буферного пространства. Если n равно -1, буферное пространство не ограничено; то есть весь файл может быть прочитан в память.

-B или --auto-buffers

По умолчанию, когда данные читаются из канала, буферы распределяются автоматически по мере необходимости. Если из канала читается большой объем данных, это может привести к выделению большого объема памяти. -Bопция отключает это автоматическое распределение буферов для каналов, так что для канала используется только 64 КБ (или объем пространства, указанный параметром -b ). Предупреждение: использование -B может привести к ошибочному отображению, так как только самая последняя просмотренная часть переданных данных сохраняется в памяти; любые предыдущие данные будут потеряны.

Я читаю это как означающее, что при чтении из канала -b не используется, если -B также не является опцией. Если вы хотите, чтобы это указывалось при каждом запуске, добавьте export LESS='-B'в свою среду (в bashэтом будет строка в ~/.bashrc).

Обратите внимание, что это ограничит количество lessпопыток выделения памяти независимо от того, ограничена ли память неадекватным пространством подкачки или максимальным программным пространством 4 ГБ в 32-разрядной ОС.