相关疑难解决方法(0)

管道缓冲区有多大?

作为评论,我很困惑为什么 makefile 中的“| true”与“|| true”用户cjm写道具有相同的效果

另一个要避免的原因| true是,如果命令产生足够的输出来填满管道缓冲区,它将阻塞等待 true 读取它。

我们是否有办法找出管道缓冲区的大小?

pipe buffer

162
推荐指数
5
解决办法
18万
查看次数

用零清除未使用的空间 (ext3,ext4)

如何用零清除未使用的空间?(ext3,ext4)

我正在寻找比它更聪明的东西

cat /dev/zero > /mnt/X/big_zero ; sync; rm /mnt/X/big_zero
Run Code Online (Sandbox Code Playgroud)

就像FSArchiver正在寻找“已用空间”并忽略未使用但相反的站点。

目的:我想压缩分区图像,因此强烈建议用零填充未使用的空间。

顺便提一句。对于 btrfs :用零清除未使用的空间 (btrfs)

storage filesystems partition backup compression

86
推荐指数
4
解决办法
12万
查看次数

管道如何限制内存使用?

Brian Kernighan 在此视频中解释了早期贝尔实验室对基于内存限制的小型语言/程序的吸引力

一台大机器将是 64 k 字节——K,而不是 M 或 G——这意味着任何单独的程序都不会很大,所以有一种自然的趋势,即编写小程序,然后是管道机制,基本上是输入输出重定向,可以将一个程序链接到另一个程序。

但考虑到数据必须存储在 RAM 中才能在程序之间传输,我不明白这如何限制内存使用。

来自维基百科

在大多数类 Unix 系统中,一个管道的所有进程同时启动[强调我的],它们的流适当连接,并由调度程序与机器上运行的所有其他进程一起管理。将 Unix 管道与其他管道实现区分开来的一个重要方面是缓冲的概念:例如,发送程序每秒可能产生 5000 个字节,而接收程序每秒只能接受 100 个字节,但不能数据丢失。相反,发送程序的输出保存在缓冲区中。当接收程序准备好读取数据时,管道中的下一个程序从缓冲区读取。在 Linux 中,缓冲区的大小为 65536 字节 (64KB)。如果需要,可以使用名为 bfr 的开源第三方过滤器来提供更大的缓冲区。

这让我更加困惑,因为这完全违背了小程序的目的(尽管它们在一定程度上是模块化的)。

我唯一能想到的解决我的第一个问题(内存限制有问题取决于大小数据)的唯一方法是,当时根本没有计算大型数据集,而真正的问题管道是要解决的程序本身所需的内存量。但是鉴于维基百科引用中的粗体文本,即使这让我感到困惑:因为一次没有实施一个程序。

如果使用临时文件,所有这些都会很有意义,但我的理解是管道不会写入磁盘(除非使用交换)。

例子:

sed 'simplesubstitution' file | sort | uniq > file2
Run Code Online (Sandbox Code Playgroud)

我很清楚这sed是读取文件并逐行吐出。但是sort,正如 BK 在链接的视频中所说的那样,是一个句号,所以所有的数据都必须被读入内存(或者是吗?),然后它被传递给uniq,这(在我看来)将是一个-一行一次的程序。但是在第一个和第二个管道之间,所有数据都必须在内存中,不是吗?

pipe history

40
推荐指数
2
解决办法
7641
查看次数

标签 统计

pipe ×2

backup ×1

buffer ×1

compression ×1

filesystems ×1

history ×1

partition ×1

storage ×1