2010-03-25 3 views
9

lazy bytestrings을 사용하여 대용량 데이터 스트림을 읽고, 파싱하는 동안 X 바이트 이상을 사용할 수 있는지 알고 싶습니다. 즉, 바이트 테스트가 X 바이트 이상인 지 알고 싶습니다.Haskell에서 Lazy ByteString의 길이를 호출하면 전체 문자열이 메모리에 저장됩니까?

length을 호출하면 전체 스트림이로드되므로 결과적으로 게으른 바이트 스트링을 사용하지 않을 수 있습니까?

그렇다면 다음과 같은 결과가 발생합니다. 전체 스트림을로드하지 않고 X 바이트 이상을 보유하고 있는지 확인하는 방법은 무엇입니까?

편집 : 원래 파일을 읽는 맥락에서 질문했지만 파일 크기를 결정할 수있는 더 나은 방법이 있다는 것을 알고 있습니다. 그러나 내가 필요로하는 최고의 궁극적 인 해결책은 게으른 바이트 테스트 소스에 의존해서는 안됩니다.

답변

11

예.

length . take x.

+0

감사합니다. 그래서 대답은 yes입니다. length를 사용하면 전체 문자열이 메모리에로드됩니다. – me2

+0

예, 길이가 전체 목록을 강제로 "load : it."따라서 "take"형태의 대책 – ADEpt

+1

그래서 우리는 모두 이해합니다. 예 길이는 문자열을 메모리로 강제합니다. 따라서 take x 먼저 최소한 x 바이트를 메모리에 강제로 저장합니다. – MtnViewMark

1

파일 길이를 가져 오는 데 hFileSize :: Handle -> IO Integer을 사용하지 않는 이유가 있습니까?

+0

입력이 실제로 파일이 아니라 네트워크 스트림 일 수 있기 때문에 가능합니다. 나는 데이터의 실제 길이에 관심이 없지만 내용을 유효하게 만들 충분한 데이터가 있는지 (또는 잘린 경우 데이터가 손상되었는지) 여부에 관심이있다. – me2

+3

지구상에 끝까지 읽지 않고 스트림의 길이를 찾을 수있는 프로그램이 없습니다. –

0

편집 : 죄송합니다. 나는 테스터 링이리스트라고 생각하고 있었다고 생각한다. bytestrings에는 genericLength가 없습니다.

lengthInt을 반환하는 유형이 엄격하므로 엄격합니다. 당신은 Data.List에서 genericLength을 사용할 수 있으며 지연 페이 노수를 정의하는 라이브러리를 가져오고 그 라이브러리에 Num 인스턴스를 제공 할 수 있습니다 (예 : numbers 라이브러리 :

) 원하는 방식으로 함수를 표현할 수 있지만 ephemient의 대답은 기능적으로 동일하며 새 라이브러리를 가져올 필요가 없습니다.

http://coder.bsimmons.name/blog/2010/03/lazy-arithmetic-in-haskell/

+0

ByteString은'genericLength' .너는 너 자신을 써야한다. – kennytm

+0

어딘가에 (아마 지금 Hackage에서 찾을 수는 없지만) "chunked"자연수 형식이 data Nat = Zero | Sum Integer Nat'을 사용하고 있는데, 이것은'take' 기반 솔루션보다 훨씬 효율적입니다. –

0

그것은 전체 문자열을 반복해야하지만 것입니다 당신이 돈이 ':

난 그냥 그 접근 방법 같은 소리 경우에 관심이있을 수 있습니다, 여기에 주제에 대한 블로그 게시물을했다 다른 곳에서는 전체 게으른 바이트 문자열에 대한 참조를 유지해야합니다. 꼬리 방향으로 진행하면서 문자열 머리를 자유롭게 할 수 있어야한다고 생각합니다.

관련 문제