为什么“less”命令占用了太多内存

为什么“less”命令占用了太多内存

我使用 less 检查一个相当大的文件(在具有 4GB RAM 的机器上为 8GB)。我告诉它“滚动到末尾”(shift+ G),它运行了一段时间,然后因为耗尽了 RAM 而被终止。我以为less它不会使用超过有限数量的 RAM,我是否遗漏了什么?

答案1

使用的默认内存量less取决于它是读取文件还是从管道读取;不清楚从文件读取重定向输入时会发生什么(less < FilePath而不是less FilePath)。

以下摘自手册页(在 Ununtu 16.04 上)显示了如何控制less分配的内存:-

-bn或 --buffers=n

指定每个文件将使用的缓冲区空间量,以千字节(1024 字节)为单位。默认情况下,每个文件使用 64 K 的缓冲区空间(除非文件是管道;请参阅-B选项)。-b选项指定n每个文件应使用 KB 的缓冲区空间。如果n-1,缓冲区空间不受限制;也就是说,整个文件都可以读入内存。

-B 或 --auto-buffers

默认情况下,当从管道读取数据时,会根据需要自动分配缓冲区。如果从管道读取大量数据,这会导致分配大量内存。-B选项禁用管道缓冲区的自动分配,因此只有 64 K(或由-b选项)用于管道。警告:使用-B可能会导致错误显示,因为只有最近查看的管道数据部分保存在内存中;任何早期的数据都会丢失。

我理解的意思是,当从管道读取时,-b除非-B也是一个选项。如果您希望在每次运行时都指定此项,则将其添加export LESS='-B'到您的环境中(bash这将是 中的一行~/.bashrc)。

请注意,这将限制尝试分配的内存less,无论内存是由于交换空间不足还是由于 32 位操作系统上的最大 4GB 程序空间而受到限制。

相关内容