의 위치에 따라 결정된다 유일한 차이점은 데이터 량이 다시 핸드이다?
<>
는 어떤 크기로 성장할 수있는 스칼라로 읽고, 그래서 당신이 read
시스템 호출에 전달 된 버퍼의 크기를 언급하는 것 같아요.
5.14 이전에는 4KB의 청크 파일 핸들에서 Perl을 읽었습니다. 5.14에서는이 설정을 구성 할 수 있으며 기본값은 8KB입니다.
$ 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
단지 다음 명령이 (
<>
별칭되는)
readline
read
포함하는 모든 버퍼링 된 읽기 기능에 적용
./Configure -Accflags=-DPERLIOBUF_DEFAULT_BUFSIZ=8192
를 사용 perl
가 구축 될 때 구성 될 수
, 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 나는이 코드를 훨씬 더 짧은 줄이있는 파일에서 돌렸을 때, 그것을 마술처럼 작동 시켰고 정말 빨리 끝내었다. 줄이 너무 깁니다. 마치 하나 또는 두 줄로 압축 된 큰 텍스트 파일을 가진 것처럼 생각하십시오 (필자는 이러한 파일의 형식을 제어 할 수 없습니다). – yonyon100
하지만 레코드 분리 기호'$ /'를 설정할 수 있습니다. 거기에 라인을 쪼갤 수있는 것이 있습니까? – Sobrique