对于 1GB 缓冲区,可以使用什么来代替“buffer”?

对于 1GB 缓冲区,可以使用什么来代替“buffer”?

缓冲器(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。

相关内容