저는 수백만 라인까지 되돌릴 수있는 HTTP를 통한 쿼리의 결과를 파싱하려고합니다. 각 라인을 파싱해야하는 곳입니다. 이상적으로는 연결에서 한 번에 한 행을 읽고 원하는대로 파싱하는 것을 좋아합니다. 기본적으로 FileHandle-esque 반복기이지만, 기존 HTTP 라이브러리는 모두 한 번에 모든 내용을 가져 오는 것처럼 보입니다. 파일 또는 b) 코드 심판을 사용하여 청크를 처리합니다. A는 2 단계 솔루션이기 때문에 이상적이지 않습니다. 데이터가 전송 된 후 파일을 한 줄씩 읽어야하고 아마도 불필요하게 저장소를 차지할 것입니다. B는 코드 참조로 처리하는 대신 각 라인을 반환 할 수 있기를 바라며, 또한 청크가 라인이 아니기 때문에 LWP 솔루션은 LWP 라인 재구성의 이점을 얻지 못하기 때문에 이상적이지 않습니다. 비 차단 솔루션 (AnyEvent 및 Coro 사용)이 있지만 줄 단위 처리가 아닌 비 차단성에 더 관심이있는 것 같습니다. 누구든지 여기 좋은 방향으로 나를 가리킬 수 있습니까, 아니면 잘못된 나무를 짖고 있습니까?Perl에 HTTP 연결 반복자가 있습니까?
0
A
답변
0
콜백을 사용하면 원하는 모든 작업을 수행 할 수 있습니다. 버퍼를 가져 와서 버퍼에서 라인을 읽을 때 입력을 버퍼 할 수 있습니다. Perl을 사용하면 문자열 (open
)을 포함하여 거의 모든 것에 파일 핸들을 열 수 있습니다 (tie
사용). 당신이 찾을 수있는 다른 무엇이라도 궁극적으로 청크를 받아서 어쨌든 선으로 바꿀 것입니다.
0
What is the easiest way in pure Perl to stream from another HTTP resource?에 수락 된 답변을보십시오. HTTP :: Lite를 직접 사용하지는 않았지만 수신 된 데이터의 콜백 기반 처리를 지원하므로 제대로 작동하는 것으로 보입니다.
+0
링크 해 주셔서 감사합니다. 콜백은 분명히 다음 작업을 수행하는 완료된 방법입니다. – flightlessbird
콜백에서 버퍼로 먹이를주고 접근 자로부터 읽는 전략과 관련하여 회신 해 주셔서 감사합니다. 무엇을 중지할까요? 이 i) 프로세싱에서 연결을 읽는 것보다 느리다면 많은 메모리를 소비한다. ii) 빈 라인을 잘못 반환한다./해석 결과가 연결에서 읽히기 전에 버퍼의 끝에 도달 한 것처럼 보인다. – flightlessbird
@flightlessbird : i) 아무것도 아니지만 CPU가 네트워크 통신보다 몇 배 빠른 속도 때문에 가장 복잡한 처리를 제외하고는 거의 불가능합니다. ii) 자신 만의 버퍼 처리 코드를 작성하고 잘못 수행하지 않는 한, 빈 줄이나 EOF를 반환하지 않고 버퍼가 비어 있으면 버퍼에서 읽음이 차단됩니다. –
유익한 답장을 보내 주셔서 감사합니다 @ 데이브. 정리하자면, 최선의 방법은 읽기를 위해 파일 핸들로 열리는 스팅 버퍼에 추가하는 것입니다. 각 읽기 라인은 연결에서 데이터가 추가 될 때까지 차단됩니다. 그건 잘 작동합니다. – flightlessbird