В Haskell вызовет длину в Lazy ByteString принудительно всю строку в памяти? - PullRequest
9 голосов
/ 25 марта 2010

Я читаю большой поток данных, используя ленивые строки байтов, и хочу знать, доступно ли хотя бы X больше байтов при его анализе. То есть я хочу знать, если длина строки байтов не меньше X байт.

Приведет ли к этому вызов length, что приведет к загрузке всего потока, что отрицательно скажется на использовании ленивой строки?

Если да, то последующее наблюдение будет следующим: Как определить, имеет ли он хотя бы X байтов, не загружая весь поток?

РЕДАКТИРОВАТЬ: Первоначально я спросил в контексте чтения файлов, но понимаю, что есть лучшие способы определить размер файла. Однако окончательное решение, которое мне нужно, не должно зависеть от ленивого источника тестовых строк.

Ответы [ 4 ]

11 голосов
/ 25 марта 2010

Да.

length . take x.

1 голос
/ 25 марта 2010

Есть ли причина, по которой вы не используете hFileSize :: Handle -> IO Integer для получения длины файла?

0 голосов
/ 29 марта 2010

Ему придется перебирать всю строку, но если вы не сохраните ссылку на всю ленивую строку байтов где-либо еще, я считаю, что она сможет освободить верхнюю часть строки по мере ее продвижения к хвосту. .

0 голосов
/ 25 марта 2010

РЕДАКТИРОВАТЬ: извините. Я думаю, что я думал, что строки были списками. Для строк байтов нет родовой длины.

length строгий, потому что тип, который он возвращает Int строгий. Вы можете использовать genericLength из Data.List и импортировать библиотеку, которая определяет ленивые числа Пеано и дает вам экземпляр Num для них, например, библиотека numbers :

Это позволило бы вам выразить свою функцию так, как вам хотелось бы, но ответ ephemient функционально тот же и не требует импорта новой библиотеки.

Я только что сделал пост в блоге на эту тему здесь, если это звучит как подход, который вас может заинтересовать:

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

...