Подтвердить что ты не робот

Значения Haskell: Lazy vs. Strict, которые рекомендуется когда?

Я много читал в Data.Text, но мне не удалось найти много возможностей, чтобы предпочесть Strict over Lazy или наоборот.

Я понимаю, что Data.Text.Strict - это структура данных смежных символов в памяти, тогда как Data.Text.Lazy - это куски смежных символов.

Мой вопрос: почему я не должен всегда использовать Data.Text.Lazy? Кажется, что только накладные расходы - управление куском, но я не знаю, достаточно ли это заметно? В обмене операции конкатенации могут быть намного дешевле, когда значения текста становятся большими.

Мысли и идеи приветствуются!

4b9b3361

Ответ 1

Я бы сказал, что использование Data.Text.Lazy наследует многие из проблем с ленивым IO. Поэтому мое предложение было бы предпочесть Strict, и если вам нужно обрабатывать большие фрагменты данных последовательно, используйте одну из доступных потоковых библиотек. См. Также Что такое трубы/кабелепровод, пытающиеся решить.

Ответ 2

Из документов:

Data.Text.Lazy

Эффективная реализация текста в Юникоде с использованием времени и пространства с использованием списков упакованных массивов. Это представление подходит для высокопроизводительного использования и для потоковой передачи большого количества данных. Он предоставляет средства для манипулирования большим текстом, не требуя, чтобы весь контент находился в памяти.

Некоторые операции, такие как concat, append, reverse и cons, имеют лучшую сложность, чем их эквиваленты Data.Text, из-за оптимизаций, возникающих из структуры списка спина. А для других операций ленивые тексты обычно находятся в пределах нескольких процентов от строгих, но с лучшим использованием кучи. Для данных, превышающих доступную память, или если у вас ограниченные ограничения памяти, этот модуль будет единственным вариантом.

Data.Text

Эффективная реализация текста в формате Unicode с использованием упакованных массивов Word16. Подходит для критически важного использования, как с точки зрения больших объемов данных, так и с высокой скоростью.

...

Большинство функций в этом модуле подлежат слиянию, что означает, что конвейер таких функций обычно выделяет не более одного значения Text.

Таким образом, хотя Data.Text достаточно для большинства целей, Data.Text.Lazy предназначен специально для тех случаев, когда вы обрабатываете очень большие объемы данных и не можете практически полностью сохранить их в памяти сразу. Data.Text является несколько более эффективным в целом, но лучше для вашего приложения полностью зависит от вашего варианта использования. Хорошее эмпирическое правило должно начинаться со строгих, и если у вас проблемы с памятью или скоростью, попробуйте использовать ленивый.

Ответ 3

Часто, пакеты для подключения к базе данных (postgres, redis и т.д.) дают только строгие значения; Любые значения, которые вы получаете от них, создаются с помощью таких функций, как Data.Text.Lazy fromStrict. В этом случае использование ленивых значений добавляет дополнительные накладные расходы. Примером такого пакета является postgresql-simple.