字符出现频率

2024-02-07

我正在尝试使用查找文件中字符的频率Haskell。我希望能够处理大约 500MB 大小的文件。

到目前为止我已经尝试过的

  1. 它完成了这项工作,但有点慢,因为它解析了文件 256 次

    calculateFrequency :: L.ByteString -> [(Word8, Int64)]
    calculateFrequency f = foldl (\acc x -> (x, L.count x f):acc) [] [255, 254.. 0]
    
  2. 我也尝试过使用 Data.Map 但程序内存不足(在 ghc 解释器中)。

    import qualified Data.ByteString.Lazy as L
    import qualified Data.Map as M
    
    calculateFrequency' :: L.ByteString -> [(Word8, Int64)]
    calculateFrequency' xs = M.toList $ L.foldl' (\m word -> M.insertWith (+) word 1 m) (M.empty) xs
    

这是使用可变的、未装箱的向量而不是更高级别的构造的实现。它还使用conduit用于读取文件以避免惰性 I/O。

import           Control.Monad.IO.Class
import qualified Data.ByteString             as S
import           Data.Conduit
import           Data.Conduit.Binary         as CB
import qualified Data.Conduit.List           as CL
import qualified Data.Vector.Unboxed.Mutable as VM
import           Data.Word                   (Word8)

type Freq = VM.IOVector Int

newFreq :: MonadIO m => m Freq
newFreq = liftIO $ VM.replicate 256 0

printFreq :: MonadIO m => Freq -> m ()
printFreq freq =
    liftIO $ mapM_ go [0..255]
  where
    go i = do
        x <- VM.read freq i
        putStrLn $ show i ++ ": " ++ show x

addFreqWord8 :: MonadIO m => Freq -> Word8 -> m ()
addFreqWord8 f w = liftIO $ do
    let index = fromIntegral w
    oldCount <- VM.read f index
    VM.write f index (oldCount + 1)

addFreqBS :: MonadIO m => Freq -> S.ByteString -> m ()
addFreqBS f bs =
    loop (S.length bs - 1)
  where
    loop (-1) = return ()
    loop i = do
        addFreqWord8 f (S.index bs i)
        loop (i - 1)

-- | The main entry point.
main :: IO ()
main = do
    freq <- newFreq
    runResourceT
        $  sourceFile "random"
        $$ CL.mapM_ (addFreqBS freq)
    printFreq freq

我在 500MB 的随机数据上运行了这个,并与 @josejuan 基于 UArray 的答案进行了比较:

  • 基于管道/可变向量:1.006s
  • UArray:17.962s

我认为应该可以保留 josejuan 的高级方法的大部分优雅性,同时保持可变向量实现的速度,但我还没有机会尝试实现类似的东西。另请注意,使用一些通用辅助函数(如 Data.ByteString.mapM 或 Data.Conduit.Binary.mapM),实现可能会更加简单,而不会影响性能。

You can 在 FP Haskell Center 上尝试这个实现 https://www.fpcomplete.com/user/snoyberg/random-code-snippets/conduit-frequency-of-characters以及。

EDIT:我添加了其中一个缺失的功能conduit并清理了一些代码;现在看起来如下所示:

import           Control.Monad.Trans.Class   (lift)
import           Data.ByteString             (ByteString)
import           Data.Conduit                (Consumer, ($$))
import qualified Data.Conduit.Binary         as CB
import qualified Data.Vector.Unboxed         as V
import qualified Data.Vector.Unboxed.Mutable as VM
import           System.IO                   (stdin)

freqSink :: Consumer ByteString IO (V.Vector Int)
freqSink = do
    freq <- lift $ VM.replicate 256 0
    CB.mapM_ $ \w -> do
        let index = fromIntegral w
        oldCount <- VM.read freq index
        VM.write freq index (oldCount + 1)
    lift $ V.freeze freq

main :: IO ()
main = (CB.sourceHandle stdin $$ freqSink) >>= print

功能上的唯一区别是频率的打印方式。

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

字符出现频率 的相关文章

  • 一个目录中的多个 Haskell cabal-packages

    在一个目录中包含多个 cabal 软件包的推荐方法是什么 Why 我有一个包含许多可分离模块的旧项目 由于最初它们只形成一个程序 因此将它们放在同一目录中以便于编译非常方便 而且现在仍然如此 Options 只是忍受并将所有内容 包括保存内
  • Haskell 中动态规划的高效表

    我已经编码了0 1背包问题 http en wikipedia org wiki Knapsack problem 0 1 knapsack problem在哈斯克尔 我对迄今为止所取得的懒惰和普遍性水平感到相当自豪 我首先提供用于创建和处
  • 模式匹配需要圆括号来表示非空列表而不是方括号

    在 Haskell 中 为什么模式匹配期望列表在不为空时有圆括号而不是方括号 当它尝试与空列表 方括号 进行模式匹配时 为什么它不遵循相同的约定 圆括号不应该专门为元组保留吗 例如 下面不起作用 third Integral a gt a
  • 如何在递归方案中派生实例

    我正在测试其中的一些想法本文 http blog sumtypeofway com an introduction to recursion schemes 我想派生 Term 类型的 Eq 实例 LANGUAGE DeriveFuncto
  • 在帖子上生成最近帖子列表时,如何避免依赖循环?

    所以这有效 create archive html do route idRoute compile do posts lt myRecentFirst gitTimes lt lt loadAll posts let archiveCtx
  • Haskell GHC:具有 N 个构造函数的模式匹配的时间复杂度是多少?

    假设我们有以下 Haskell data T T0 T1 T2 TN toInt T gt Int toInt t case t of T0 gt 0 T1 gt 1 T2 gt 2 TN gt N 这里使用什么算法来执行模式匹配 我看到两
  • 测试列表是否已排序

    在 haskell 中找到最小列表确实很容易 foldl1 min 9 5 7 3 7 4 6 10 给我3 我更换了min with lt 测试列表是否已排序 foldl1 lt 9 5 7 3 7 4 6 10 我收到此错误消息 No
  • 结构上强制的自由替代,没有左派分配性

    有一个不错的免费替代品 http hackage haskell org package free 4 12 4 docs Control Alternative Free html在伟大的free包 它将函子提升到左分配替代方案 也就是说
  • 在 Haskell 中,如何将嵌套上下文中的函数“应用”到上下文中的值?

    nestedApply Applicative f Applicative g gt g f a gt b gt f a gt g f b 正如类型所示 如何获得 a gt b 应用于那个a在上下文中f 感谢帮助 这是关注类型很有帮助的情况
  • Haskell:如何创建将函数应用于元组项的最通用函数

    这是一个个人练习 旨在更好地理解 Haskell 类型系统的局限性 我想创建最通用的函数 将某些函数应用于 2 条目元组中的每个条目 例如 applyToTuple fn a b fn a fn b 我试图让这个函数在以下每种情况下都起作用
  • Haskell:处理死锁的自引用列表

    GHC 允许永久阻止以下内容是否有任何有用的理由 list 1 tail list 看起来列表迭代器 生成器有点复杂 我们应该能够做一些更有用的事情 Return error Infinitely blocking list Return
  • 算法 - 如何有效删除列表中的重复元素?

    有一个list L 它包含以下元素任意类型each 如何有效删除此类列表中的所有重复元素 必须保留订单 只需要一个算法 因此不允许导入任何外部库 相关问题 在Python中 从列表中删除重复项以使所有元素都是唯一的最快算法是什么在维持秩序的
  • 如何获取常量内存中的统计数据

    我有一个函数 它会创建一些随机的数值结果 我知道 结果将是 a 小 a b 约 50 范围内的整数a b 我想创建一个执行上述函数 1000000 次的函数 并计算每个结果出现的频率 该函数使用随机生成器来生成结果 问题是 我不知道如何在常
  • 计算两点之间的距离(Haskell)

    给定两个元组的输入 我希望能够使用以下公式计算两点之间的距离 距离 sqrt x1 x2 2 y1 y2 2 所以我希望函数调用和输出如下所示 gt distance 5 10 3 5 5 385 当我尝试运行下面的代码时 它告诉我输入 w
  • 列表理解:制作列表列表

    你好 我正在尝试在 haskell 中创建一个函数 该函数接受一个数字 a 使用列表 即数字 将其一部分4它会创造 1 1 1 1 1 1 2 1 3 2 2 4 我正在考虑使用列表理解来创建列表 x 然后使用 1 n 中的数字创建更多列表
  • 是否有一个基于对象身份的、线程安全的记忆库?

    我知道记忆化似乎是堆栈溢出的 haskell 标签上的一个长期话题 但我think以前没有人问过这个问题 我知道 Haskell 有几个不同的 现成 记忆库 memo combinators 和 memotrie 包 利用涉及惰性无限数据结
  • 我应该使用镜头中的什么来按索引构建只读吸气剂?

    我有一个内部细节被隐藏的类型 我想提供某种镜头 可以在特定索引处读取所述类型的元素 但是not修改它们 一个Ixed我的类型的实例似乎没有做我想要的事情 因为它明确允许修改 尽管不允许插入或删除 如果我想允许只读索引 我不确定我使用什么 如
  • 解析 PHOAS 表达式

    我想我理解 PHOAS 参数化高阶抽象语法 我明白了如何漂亮地打印一个表达式 参见http www reddit com r haskell comments 1mo59h phoas for free by edward kmett cc
  • 使用 Haskell 将函数注入到 Java .class 文件中

    我使用 Haskell 编写了一个 Java 字节码解析器 它工作得很好 然而下一步让我完全难住了 我的 Haskell 程序需要修改 class 文件 以便在执行时 Java 程序打印 输入 此处的方法名称 在执行方法之前 并且 退出 此
  • 为什么 Haskell 中的点是从右向左排列的?

    如果我们有两个函数 f and g 然后在哈斯克尔h f g相当于h x f g x IE 这些函数从右到左应用于输入 有什么根本原因可以解释为什么它是从右到左 而不是从左到右吗 IE 他们为什么不做h f g相当于h x g f x 反而

随机推荐

  • 无法更改 PySide.QtGui 对象的 __class__

    我经常使用 PyQt4 有时我喜欢重载一些对象以允许我添加一些功能 这在 PyQt4 中工作得很好 例如 from PyQt4 import QtGui button QtGui QPushButton class MyPushButton
  • 在 amazon ec2 Linux 微实例上的 virtualenv 中安装 scipy 时遇到问题

    我已经安装成功了scipy在亚马逊 ec2 微实例 Ubuntu 13 04 上的默认 python 编译器中 但是我无法安装scipy在虚拟环境中 pip install scipy以这个错误结束 scipy sparse sparset
  • 将 SSD 转换为张量流中的冻结图。必须使用哪些输出节点名称?

    我使用 SSD 进行训练TensorFlow 对象检测 API https research googleblog com 2017 06 supercharge your computer vision models html如上所述he
  • 有向无环图遍历...有帮助吗?

    有点超出我的深度 需要给朋友打电话 我有一个需要遍历的有向非循环图 这是我第一次接触图论 我最近读了很多关于它的文章 但不幸的是我没有时间从学术上解决这个问题 有人可以给我一些关于如何处理这棵树的帮助吗 规则如下 有n根节点 我称之为 源
  • 在django Rest框架中实现多级嵌套关系的可写序列化器

    在 drf3 中 您现在可以通过重写 create 方法并自行处理 valid data 来实现可写嵌套序列化器 但是 如果模型中有多层嵌套关系 如下所示 class Order models Model Order model to ag
  • UIScrollView 滚动时 loadHTMLString 不会触发

    我正在尝试延迟加载UIWebViews里面一个UIScrollView 每次用户滚动时 WebViews 框架都会更新 并且应该加载新内容 这正是我遇到麻烦的地方 重新定位效果很好 但新内容 本地NSStrings 这被称为使用loadHT
  • XML CDATA 内的 HTML 使用 < 和 > 括号进行转换

    我有一些示例 XML
  • HTML / CSS 文本上的弹出 div 单击 [关闭]

    Closed 这个问题不符合堆栈溢出指南 help closed questions 目前不接受答案 I want to make popup div instead of popup window for my About picture
  • Unity 包含的 DLL 大小

    我正在研究 WebGL 项目 并且构建规模非常大 毕竟我在 Web 中建立了优化建议 我研究了构建日志 发现包含的 DLL 占用了构建大小的 85 以上 13 4 MB 空项目上的类似情况 你能帮我减少 DLL 内存吗 很难说你是否已经这样
  • VB.NET Lambda 表达式

    如果我有 Visual Studio 2008 并且我的目标是 NET 2 0 应用程序 我仍然可以使用 Lambda 表达式吗 我对 Lambda 表达式的理解是 它是内置于编译器而不是框架中的功能 因此我的结论是我可以在 NET 2 0
  • 如何查看本地分支和远程分支之间指定文件的差异?

    如何查看本地分支和远程分支指定文件的差异 我知道这个命令 git diff
  • 如何在 django 模板中重复“块”

    我想用同样的 堵塞 在同一个 django 模板中两次 我希望此块在我的基本模板中多次出现 base html h1 block title My Cool Website endblock h1 然后扩展它 blog html exten
  • 实体框架 5:代码优先的循环关系问题

    我明白为什么 EF 不允许 PK FK 关系中的 循环引用 我正在寻求有关如何更改模型以使以下场景发挥作用的建议 Scenario 三个实体 Employee Agency WorkRecord 他们的目的是记录员工工作所花费的时间 Emp
  • Laravel 5 覆盖辅助函数 __() 因为在 WordPress 中使用

    我读过 stackoverflow 上的几篇文章但没有帮助 所以我希望有人能给出好的答案 我正在使用 Laravel 和 wordpress 现在有一个错误 是否可以重命名或其他方法来改变它 Error Fatal error Cannot
  • ASP.NET Server.HtmlEncode 限制

    我正在使用 Server HTMLEncode 来编码我的 HTML 我注意到它不会转义单引号 如果您在 html 中使用单引号 这是一个限制 例如
  • pandas 数据帧上的 s3fs gzip 压缩

    我正在尝试使用以下方法在 S3 上将数据帧写入为 CSV 文件s3fs https github com dask s3fs图书馆和熊猫 尽管有文档 但我担心 gzip 压缩参数不适用于 s3fs def DfTos3Csv df file
  • C++ 模板函数在头文件中编译,但在实现中不编译

    我正在尝试学习模板 但遇到了这个令人困惑的错误 我在头文件中声明了一些函数 并且我想创建一个单独的实现文件来定义这些函数 这是调用标头的代码 dum cpp include
  • 如何为AWS RDS实例设置数据库时区[重复]

    这个问题在这里已经有答案了 我们在 AWS RDS 实例上使用最新的 MySQL 服务器 并配置为在美国东部数据中心运行它 我们假设任何新的 Date 或 Time now 调用都会将日期存储在数据库服务器运行的时区中 有没有办法让我在美国
  • 在缩略图中调整图像 WordPress - woocommerce

    我尝试了很多技巧 用谷歌搜索了很多网站 使用了很多 WordPress 插件 但都失败了并且厌倦了 我正在运行一个优惠券 交易网站 我的问题是我想完全显示产品图像而不进行任何裁剪 即使它的尺寸很小 原始图像是https postimg or
  • 字符出现频率

    我正在尝试使用查找文件中字符的频率Haskell 我希望能够处理大约 500MB 大小的文件 到目前为止我已经尝试过的 它完成了这项工作 但有点慢 因为它解析了文件 256 次 calculateFrequency L ByteString