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] [       <=>                   ]

이 목적을 위해 두 가지 추가 도구가 구현되었습니다.완충관그리고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입니다.

관련 정보