缓冲器(1)似乎很旧,并且具有硬编码值,阻止它缓存大量数据。
$ buffer -m 1G
max_shmem 1 too low
// it doesn't even understand gigabytes
$ buffer -m 1000M
Cannot handle that many blocks, aborting!
$ buffer -m 1000M -s 1m
blocksize 1048576 out of range
用什么代替?
答案1
非标准移动:使用套接字缓冲区。
例子:
# echo 2000000000 > /proc/sys/net/core/wmem_max
$ socat -u system:'pv -c -N i /dev/zero',sndbuf=1000000000 - | pv -L 100k -c -N o > /dev/null
i: 468MB 0:00:16 [ 129kB/s] [ <=> ]
o: 1.56MB 0:00:16 [ 101kB/s] [ <=> ]
为此实施了两个额外的工具:缓冲管道和映射opentounixsocket
$ ./buffered_pipeline ! pv -i 10 -c -N 1 /dev/zero ! $((20*1000*1000)) ! pv -i 10 -L 100k -c -N 2 ! > /dev/zero
1: 13.4MB 0:00:40 [ 103kB/s] [ <=> ]
2: 3.91MB 0:00:40 [ 100kB/s] [ <=> ]
答案2
INPUT | {
mkdir -p buf &&
mount -osize=1g -ttmpfs none buf || exit
cat >buf/...
work_it <buf/...
umount buf
} | OUTPUT
对于环形缓冲循环可能......
INPUT | {
mkdir -p buf &&
mount -osize=1g -ttmpfs none buf &&
while dd bs=1 count=1 >buf/... &&
[ -s buf/... ]
do dd obs=64k |
dd bs=64k count=16383k >>buf/...
work_it <buf/... 2>&3
done 3>&2 2>/dev/null &&
umount buf
} | OUTPUT
答案3
回答在管道中缓冲无限量数据的实用程序?建议使用pv -B $SIZE
.这手册页表明它可以处理更大的缓冲区大小。
-B BYTES, --buffer-size BYTES
使用大小为的传输缓冲区
BYTES
字节。可以添加后缀“K”、“M”、“G”或“T”来表示千字节 (*1024)、兆字节等。默认缓冲区大小是输入文件的文件系统的块大小乘以 32(最大 512 KiB),如果无法确定块大小,则为 400 KiB。