Warning: file_get_contents(/data/phpspider/zhask/data//catemap/6/haskell/8.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181

Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/opencv/3.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Memory management 如何在现有Haskell代码中从String转换为Data.ByteString.Lazy?_Memory Management_Haskell_Profiling - Fatal编程技术网

Memory management 如何在现有Haskell代码中从String转换为Data.ByteString.Lazy?

Memory management 如何在现有Haskell代码中从String转换为Data.ByteString.Lazy?,memory-management,haskell,profiling,Memory Management,Haskell,Profiling,我有一个Haskell代码,它使用了大量字符串,在对其进行配置时,代码似乎使用了大量内存来存储列表[]。这个问题的一个解决方案是使用Data.ByteString.Lazy代替字符串,但是 做这件事时我需要关心什么 代码的哪一部分必须仔细查看:折叠、映射 感谢您的回复,您应该知道,ByteString对it元素上的迭代非常有害,但对Concatation等更好 如果要使用ByteString,必须将字符串转换为ByteString,只需执行以下操作 import Data.ByteString.

我有一个Haskell代码,它使用了大量字符串,在对其进行配置时,代码似乎使用了大量内存来存储列表[]。这个问题的一个解决方案是使用Data.ByteString.Lazy代替字符串,但是

做这件事时我需要关心什么

代码的哪一部分必须仔细查看:折叠、映射


感谢您的回复,您应该知道,
ByteString
对it元素上的迭代非常有害,但对Concatation等更好

如果要使用ByteString,必须将字符串转换为ByteString,只需执行以下操作

import Data.ByteString.Lazy as B
并将a
B
粘贴在与之配合使用的每个函数前面-大多数用于
字符串的函数也适用于
ByteString
。请注意-您必须将使用的字符串转换为带有某些函数的ByteString

如果改用
Data.ByteString.Lazy.Char8
,则可以轻松使用
pack
,但所有大于255的字符都将被截断。此外,这种类型更适合于二进制数据,并保护内存

<>强>编辑:,如果您想处理文本字符串,则应该考虑使用包文本。查看更多详细信息。

如果您正在使用GHC并且正在转换包含大量字符串文本的代码,那么扩展可能非常方便。只需将以下内容添加到源文件的顶部:

{-# LANGUAGE OverloadedStrings #-}
而且您不必对代码中的任何字符串文本使用
B.pack
。例如,您可以具有以下内容:

equalsTest :: B.ByteString -> Bool
equalsTest x = x == "Test"

如果没有扩展,这将产生错误,因为您不能在
ByteString
[Char]
上使用
=
。通过扩展,字符串文字的类型为
(IsString a)=>a
,而
ByteString
IsString
的一个实例,因此
“Test”
在这里被键入
ByteString
,没有错误。

我也考虑过建议使用这个,但因为它是一个语言扩展,这可能会破坏可移植性。用Haskell编写软件的人使用的不是GHC?哦,是的,的确如此。例如,有人告诉我,Utrecht Haskell编译器有时可以创建更快的代码。随着扩展的发展,这似乎是相当安全的:它很方便,它可以使代码更干净,而且你可以通过一个快速的
sed
来摆脱它。为什么ByteString“对迭代之类的事情真的不好”?它归结为一个8位整数的向量;完全像一个C
char*
map
over strict Bytestrings对目标向量执行单个分配,从源向量读取每个字节,应用映射函数,并将结果放入内存。所有的东西都没有包装。它受到流融合的影响。我无法想象有什么比这更好的迭代了!这就是我在学校时的想法。我认为,如果要从ByteString的头部添加/删除元素(尤其是添加元素),需要进行大量的数组复制。但是是的,我可能错了。如果您的操作是cons-heavy,那么链表或Lazy-bytestring理论上比严格的bytestring更合适。如果它是append-heavy,那么Lazy-bytestring将在固定时间内执行该操作。不过,这是一种权衡;虽然附加物是常数时间,但会丢失使用纯向量获得的引用的局部性。这比allocate/memcpy周期快还是慢取决于你的应用程序——幸运的是,两者都很容易尝试!