【发布时间】:2010-09-15 06:40:44
【问题描述】:
我有一个使用大量字符串的 Haskell 代码,在对其进行分析时,似乎该代码使用大量内存来存储列表 []。解决这个问题的一种方法是使用 Data.ByteString.Lazy 代替 String,但是
这样做时我需要注意什么?,
必须仔细查看代码的哪一部分:折叠、映射、...?
感谢回复
【问题讨论】:
标签: memory-management haskell profiling
我有一个使用大量字符串的 Haskell 代码,在对其进行分析时,似乎该代码使用大量内存来存储列表 []。解决这个问题的一种方法是使用 Data.ByteString.Lazy 代替 String,但是
这样做时我需要注意什么?,
必须仔细查看代码的哪一部分:折叠、映射、...?
感谢回复
【问题讨论】:
标签: memory-management haskell profiling
OverloadedStrings 扩展在您使用 GHC 并且正在转换包含大量字符串文字的代码时会很方便。只需将以下内容添加到源文件的顶部:
{-# LANGUAGE OverloadedStrings #-}
而且您不必在代码中的任何字符串文字上使用B.pack。例如,您可以有以下内容:
equalsTest :: B.ByteString -> Bool
equalsTest x = x == "Test"
如果没有扩展名,这将产生错误,因为您不能在 ByteString 和 [Char] 上使用 ==。通过扩展,字符串字面量的类型为(IsString a) => a,而ByteString 是IsString 的一个实例,所以这里的"Test" 被键入为ByteString 并且没有错误。
【讨论】:
sed 摆脱它。
您应该知道,ByteString 对于迭代 it 元素之类的事情确实很糟糕,但更适合 Concatation 等。
如果您想使用 ByteStrings,您必须将 String 转换为 ByteString,只需执行类似的操作
import Data.ByteString.Lazy as B
并在与它们一起使用的每个函数前面加上 B - String 的大多数函数也适用于 ByteString。请注意 - 您必须将您使用的字符串转换为具有某些功能的 ByteString。
如果您改用Data.ByteString.Lazy.Char8,则可以轻松使用pack,但所有大于255 的字符都将被截断。此外,这种类型更适合二进制数据和安全内存。
编辑:如果你想处理文本字符串,你应该考虑使用包文本。查看here了解更多详情。
【讨论】:
char * 完全一样。 map over strict Bytestrings 对目标向量进行一次分配,从源向量中读取每个字节,应用映射函数,并将结果放入内存。一切都是开箱即用的。它受到流融合的影响。我无法想象有什么比这更适合迭代了!