どのように私は<>
オペレータのバッファサイズを変更することができるの位置のバイト数に応じて決定されること?ですか
<>
は、任意のサイズに成長することができ、スカラに読み込むので、私はあなたがread
システムコールに渡されたバッファのサイズを参照していると思います。
5.14より前には、4つのKiBチャンクのファイルハンドルからPerlを読み込みました。 5.14ではこの設定が可能で、デフォルトは8 KiBでした。
$ perl -e'print("x" x 9_999, "\n") for 1..2' >large_lines
$ strace 5.10.1t/bin/perl -e'my $line = <>' large_lines 2>&1 | grep read.*xxx
read(3, "xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx"..., 4096) = 4096
read(3, "xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx"..., 4096) = 4096
read(3, "xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx"..., 4096) = 4096
$ strace 5.14.2t/bin/perl -e'my $line = <>' large_lines 2>&1 | grep read.*xxx
read(3, "xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx"..., 8192) = 8192
read(3, "xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx"..., 8192) = 8192
perl
が構築される場合にのみこれは
read
含むすべての緩衝読み出し機能、に適用される次のコマンドを
./Configure -Accflags=-DPERLIOBUF_DEFAULT_BUFSIZ=8192
を使用して、構成することができる
、readline
(れる<>
は別名である)、readpipe
eof
ですが、sysread
ではありません。
注番号への参照に$/
を設定するreadline
(<>
)が依然としてバッファされるread
、として機能させるようにします。
$ strace perl -e'$/ = \8193; my $block = <>' large_lines 2>&1 | grep read.*xxx
read(3, "xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx"..., 8192) = 8192
read(3, "xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx"..., 8192) = 8192
あなたが実際に単一read
システムコールを実行する場合は、sysread
を使用する必要があります。
$ strace perl -e'sysread(STDIN, $buf, 8193)' <large_lines 2>&1 | grep read.*xxx
read(0, "xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx"..., 8193) = 8193
私たちはここでどのくらい話していますか?私はレコードの区切り文字でこの構造体を使用しましたが、かなりの数の行が長くて、特に問題ないと思います。あなたがあなたを減速させる 'while'ループだと確信していますか? – Sobrique
@Sobrique私は確信していませんが、このコードをはるかに短い行のファイルで実行したとき、それは魔法のように働き、とても速く走っていました。線は非常に長いです。あたかも大きなテキストファイルをすべて1行または2行に収めているかのように考えてください(私はこれらのファイルの形式を制御しません)。 – yonyon100
しかし、あなたは '$ /' - レコードセパレータを設定できます。あなたがラインを上に分けることができる適切なものはありますか? – Sobrique