Haskell: Lazy vs. Strict Text values, which one is recommend



我读了很多关于数据的文章。文本,但我还没有找到太多的方式在什么时候更喜欢严格而不是懒惰,反之亦然。

我的理解是data . text . strict是内存中连续字符的数据结构,而data . text . lazy是连续字符的块。

我的问题是为什么我不应该总是使用Data.Text.Lazy?似乎唯一的开销是块管理,但我不知道它是否足够明显?作为交换,当Text值变大时,连接操作可以便宜得多。

欢迎你的想法和见解!

From the docs:

Data.Text.Lazy

使用打包数组列表的时间和空间效率高的Unicode文本实现。这种表示适合高性能使用和大量数据流。它提供了一种操作大量文本的方法,而不需要将整个内容驻留在内存中。

一些操作,如concat、append、reverse和cons,比它们的Data具有更高的复杂性。文本等效物,由于列表脊柱结构的优化。对于其他操作,惰性文本通常在严格文本的几个百分点以内,但具有更好的堆利用率。对于大于可用内存的数据,或者如果您有严格的内存限制,该模块将是唯一的选择。

数据。文本

使用打包的Word16数组的时间和空间效率高的Unicode文本实现。适用于性能要求苛刻的场合,无论是数据量大还是速度快。

此模块中的大多数函数都要进行融合,这意味着此类函数的管道通常最多分配一个Text值。

因此,虽然Data.Text对于大多数用途来说已经足够了,但Data.Text.Lazy特别适用于当您有非常大量数据要处理并且实际上不能一次将所有数据保存在内存中时。一般来说,Data.Text在某种程度上更有效,但哪一个更适合您的应用程序完全取决于您的用例。一个好的经验法则是从strict开始,如果您有内存或速度问题,那么尝试使用lazy。

我想说,使用Data.Text.Lazy继承了懒惰的IO的许多问题。所以我的建议是首选Strict,如果您需要按顺序处理大块数据,请使用可用的流库之一。参见What is pipes/conduit trying solve

通常,连接数据库的包(postgres, redis等)只给你严格的值;从它们获得的任何惰性值都是通过Data.Text.LazyfromStrict这样的函数创建的。在这种情况下,使用惰性值会增加额外的开销。一个这样的包的例子是postgresql-simple

相关内容

最新更新