1GBバッファに「バッファ」の代わりに何を使用できますか? [コピー]

1GBバッファに「バッファ」の代わりに何を使用できますか? [コピー]

バッファ(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] [       <=>                   ]

この目的のために、2つの追加のツールが実装された。緩衝管そして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バイト。キロバイト(* 1024)、メガバイトなどを表すために、サフィックス「K」、「M」、「G」、または「T」を追加できます。デフォルトのバッファサイズは、入力ファイルファイルシステムのブロックサイズに32(最大512KiB)を掛けた値です。または、ブロックサイズが確認できない場合は400KiBです。

関連情報