gpt4 book ai didi

string - Haskell 中的内存高效字符串

转载 作者:行者123 更新时间:2023-12-03 11:29:31 25 4
gpt4 key购买 nike

通常推荐的 Haskell 字符串类型似乎是 ByteString 或 Text。我经常使用大量的短(英文单词大小)字符串,并且通常需要将它们存储在 Data.Map 等查找表中。在许多情况下,我发现在这种情况下,字符串表占用的内存比字节字符串表要少。 Word8 的 Unboxed Data.Vectors 也(很多)比 ByteStrings 紧凑。

当需要在 Haskell 中存储和比较大量小字符串时,最佳实践是什么?

下面我尝试将一个特定的有问题的案例浓缩为一个小例子:

import qualified Data.ByteString.Lazy.Char8 as S
import qualified Data.ByteString as Strict
import qualified Data.Map as Map
import qualified Data.Vector.Unboxed as U
import qualified Data.Serialize as Serialize
import Control.Monad.State

main = putStr
. unlines . map show . flip evalState (0,Map.empty)
. mapM toInt
. S.words
=<<
S.getContents


toInt x = do
let x' =
U.fromList . Strict.unpack . -- Comment this line to increase memory usage
Serialize.encode $ x
(i,t) <- get
case Map.lookup x' t of
Just j -> return j
Nothing -> do
let i' = i + (1::Int)
put (i', Map.insert x' i t)
return i

当我在一个包含大约 400.000 个英文文本的文件上运行它时,带有严格字节串键的版本使用大约 50MB 内存,带有 Word8 向量的版本使用 6MB。

最佳答案

在没有其他答案的情况下,我将在这里冒险。

What is the best practice when one needs to store and compare large numbers of small strings in Haskell?



如果小字符串是为了人类可读的(例如一个英文单词),那么使用 Text .如果它们只能由计算机读取,请使用 ByteString .使用这些的严格或惰性变体的决定取决于您如何构建和使用这些小字符串。

您不需要使用自己的未装箱 VectorWord8 .如果您遇到特定情况,定期 StringText 快或 ByteString ,然后将详细信息放在 StackOverflow 上,我们将尝试找出原因。如果您进行详分割析并可以证明未装箱的 VectorWord8始终比 Text好得多或 ByteString ,然后在邮件列表、irc、reddit 等上开始对话;标准库不是一成不变的,总是欢迎改进。

但我认为你很可能只是在做一些奇怪的事情,正如 hammar 和 shang 所暗示的那样。

附言对于您的特定用例,您应该考虑更合适的数据结构来满足您的需求,而不是存储大量小字符串,例如正如 danr 所建议的那样。

关于string - Haskell 中的内存高效字符串,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/9398572/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com