惰性 IO - 字符串未被垃圾收集?

2024-04-20

我目前正在尝试将 XML 文件的内容读入Map Int (Map Int String)而且效果很好(使用 HaXml)。但是,我对程序的内存消耗不满意,问题似乎是垃圾收集。

这是我用来读取 XML 文件的代码:

type TextFile = Map Int (Map Int String)

buildTextFile :: String -> IO TextFile
buildTextFile filename = do content <- readFile filename
                            let doc = xmlParse filename content
                                con = docContent (posInNewCxt filename Nothing) doc
                            return $ buildTF con

我的猜测content即使返回后也​​保留在内存中,尽管它不需要(当然也可以是doc or con)。我得出这个结论是因为 XML 文件非常大时,内存消耗会迅速增加,尽管由此产生的结果TextFile只是单例映射的单例映射(使用特殊的测试文件,当然通常是不同的)。所以最后,我有一个Map of a Map Int String,只有一个字符串,但内存消耗高达19MB。

使用严格的应用程序($!)或使用Data.Text代替String in TextFile并没有改变任何东西。

所以我的问题是:有没有办法告诉编译器该字符串content (or doc or con)不再需要并且可以被垃圾收集?

更一般地说:我怎样才能在不猜测的情况下找出问题的真正根源?

Edit:正如 FUZxxl 建议的那样,我尝试使用 deepseq 并更改了第二行buildTextFile像这样:

let doc = content `deepseq` xmlParse filename content

不幸的是,这并没有真正改变任何东西(或者我用错了?)......


不要猜测什么消耗了内存,而是确定地找出来

第一步是确定哪些类型消耗的内存最多。您可以在 SO 上看到很多堆分析的示例,或者阅读GHC手册 http://www.haskell.org/ghc/docs/7.0.2/html/users_guide/prof-heap.html.

强制计算

If问题是惰性求值(您正在构建一个可以计算 XML 文档类型并将字符串留在堆中的堆上 thunk),然后使用 rnf 和 seq:

buildTextFile :: String -> IO TextFile
buildTextFile filename = do content <- readFile filename
                            let doc = xmlParse filename content
                                con = docContent (posInNewCxt filename Nothing) doc
                                res = buildTF con
                            return $ rnf res `seq` res

或者只使用刘海图案(!res = buildTF con),无论哪种方式都应该强制 thunk 并允许 GC 收集String.

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

惰性 IO - 字符串未被垃圾收集? 的相关文章

  • 用户状态(秒差距)

    我正在使用秒差距解析一个表达式 并且我想使用秒差距中的用户状态来跟踪这些表达式中的变量 不幸的是我真的不知道该怎么做 给出以下代码 import Data Set as Set inp x y z data Var V String var
  • 使用 Rank2Types 相比 RankNTypes 有什么优势吗?

    据我所知 仅 针对 2 级类型存在可判定的类型检查算法 GHC 是否以某种方式利用了这一事实 它有任何实际意义吗 是否还有 2 级类型的主要类型概念和类型推断算法 如果是的话 GHC 使用它吗 与Rank 2类型相比 Rank 2类型还有其
  • 通过列表搜索

    我一直在尝试定义一个函数 给定一个整数列表和一个整数 n 返回一个布尔值 指示 n 是否在列表中恰好出现一次 我有这个 但它不起作用 我无法弄清楚 once a gt a gt Bool gt Bool filter filter p x
  • Haskell FFI - 你能从 Haskell 数据结构中获取 C 指针吗?

    我有很多 C 结构体 结构如下 typedef struct unsigned int a unsigned int b StructA 还有很多功能 比如 void doSomethingWith StructA StructB Stru
  • Haskell / SmallCheck:如何控制“Depth”参数?

    我有一个简单的数据结构可以在smallcheck 中测试 LANGUAGE FlexibleInstances MultiParamTypeClasses LANGUAGE DeriveGeneric import Test Tasty i
  • Haskell 程序的 -hc 配置文件中的 PINNED 是什么意思?

    我正在尝试分析我的应用程序 分析内存使用情况时 hcRTS 选项 我注意到很多内存标记为 PINNED 当与 hy内存被标记为ARR WORDS 该程序使用以下命令创建 2400 2400 双精度矩阵Data Packed Matrixhm
  • 为什么 Haskell 类型签名声明有多个箭头?

    抱歉 这句话措辞不好 但很难描述 我想我会跳到这个例子 add Integer gt Integer gt Integer add x y x y 为什么 Integer gt Integer gt Integer 代替 Integer I
  • Haskell Servant 和流媒体

    我正在尝试添加一个功能到我的servant服务器将从 Amazon S3 获取文件并将其流式传输回用户 由于文件可能很大 我不想将它们下载到本地然后将它们提供给客户端 我宁愿将它们直接从 S3 流式传输到客户端 I use Amazonka
  • 由于标志字节串 -lt-0_10_4,无法使用 Stack 构建 hello world 程序

    通过生成一个裸露的 hello world 项目 stack new myproject simple 每当我跑步时stack setup stack init or stack build我总是出现以下错误 Downloading lts
  • 在 Haskell 中阅读 GraphML

    我正在尝试将包含单个有向图的 GraphML 文件读入 HaskellData Graph http hackage haskell org package containers 0 2 0 1 docs Data Graph html为了
  • Haskell 中的异构多态性(正确方法)

    让一个模块来抽象Area操作 错误的定义 class Area someShapeType where area someShapeType gt Float module utilities sumAreas Area someShape
  • Haskell:Where 与 Let

    我是 Haskell 的新手 我很困惑Where vs Let 它们似乎都提供了相似的目的 我读过一些比较Where vs Let但我很难辨别何时使用它们 有人可以提供一些背景信息或者一些示例来说明何时使用其中一种而不是另一种吗 哪里与让
  • GHC 可以为 monad 转换器派生 Functor 和 Applicative 实例吗?

    我正在尝试实施MaybeT本着mtl图书馆 使用这个非编译解决方案 LANGUAGE FlexibleInstances MultiParamTypeClasses UndecidableInstances import Control M
  • 函数式编程是否需要新的命名约定?

    我最近开始使用 Haskell 学习函数式编程 并在 Haskell 官方 wiki 上发现了这篇文章 如何阅读哈斯克尔 http www haskell org haskellwiki How to read Haskell What t
  • 通过 Emacs 评估 ghci 或 Hugs 中的缓冲区

    在 Emacs 中使用 sml mode 我已经能够使用以下命令将缓冲区内容直接发送到较差的 SML 进程C c C b 现在我只想用 Haskell 做同样的事情 Haskell 模式似乎不支持这一点 所以我想知道 使用 Emacs 和
  • 为什么 Haskell 中有协函子和逆变函子的区别,而范畴论却没有区别?

    这个答案是从范畴论的角度来看的 https math stackexchange com a 661989 72174包括以下语句 事实是 协函子和逆变函子之间没有真正的区别 因为每个函子只是一个协变函子 More in details a
  • Haskell 中的前提条件检查有哪些选项

    这是一个简单的问题 我认为答案很复杂 一个非常常见的编程问题是函数返回某些内容 或者前置条件检查失败 在Java中 我会使用一些抛出异常的断言函数IllegalArgumentException在方法的开头 如下所示 method body
  • 如何为强制长度为 2^n 的向量类型定义可用的 Applicative 实例

    对于某些应用程序 我需要长度为 2 n 的向量 为了强制某些操作的长度匹配 我使用 ist 应用实例定义了我的类型 如下所示 LANGUAGE GADTs DataKinds FlexibleInstances FlexibleContex
  • 如何让 Show 显示函数名称?

    作为一个让我熟悉 Haskell 的简单练习 在 Youtube 上闲逛并偶然进入美国倒计时游戏节目之后 我想为数字游戏制作一个求解器 你得到 6 个数字 需要将它们与 为了得到给定的结果 到目前为止我所得到的是非常脑死亡的 let ope
  • Haskell 下划线与显式变量

    我已经学习 Haskell 几个星期了 我有一个关于下划线的使用的问题 作为函数参数 我认为用一个具体的例子来问我的问题会更好 假设我想定义一个函数 根据提供的索引提取列表的元素 是的 我意识到 已经是预先定义的 我可以定义该函数的两种方法

随机推荐

  • 带有 SimpleCursorAdapter 的 NullPointerException

    尝试使用自定义适配器设置 gridview 我获取光标并在 ASyncTask 中设置适配器 这是我的全部代码 private class getAllData extends AsyncTask
  • 无法识别启动活动:未找到默认活动

    我是android新手 遇到了一个问题 控制台显示 无法识别启动活动 未找到默认活动 我已经添加了
  • FREEMARKER:避免转义 HTML 字符

    freemarker 输出有问题 assign optionsHTML list data as item assign optionsHTML optionsHTML
  • Cassandra 3.11.3和cqlsh不支持python 3.6和3.7? [复制]

    这个问题在这里已经有答案了 我已经安装了Python 3 6 或 3 7 with 卡桑德拉 3 11 3 但不支持cqlsh 它只支持Python 2 7版本 这是错误消息 apache cassandra 3 11 3 bin cqls
  • Typescript - 无法调用类型缺少签名的表达式

    我对打字稿很陌生 当我尝试在打字稿中像这样调用这个 javascript 时 window location http localhost 1773 Repository NetworkPlan ExportPng 我收到这样的编译器错误消
  • 如何使用 .htaccess 提供 gzip 压缩字体? (没有 mod gzip 或 deflate)

    以下是我按随机顺序尝试过的内容列表 AddHandler application x httpd php otf AddType default mimetype auto prepend file otf php zlib output
  • 对 Java 集合进行排序和分组

    我有一个有名称和分数的对象 我想对此类对象的集合进行排序 以便它们按名称分组并按每组中的最大分数排序 并且在组内也按降序分数排序 让我展示一下我想要实现的目标 假设我有这些对象 名称 分数 a 3 a 9 b 7 b 10 c 8 c 3
  • Spark 使用前一行的值向数据帧添加新列

    我想知道如何在 Spark Pyspark 中实现以下目标 初始数据框 id num 4 9 0 3 7 0 2 3 0 1 5 0 结果数据框 id num new Col 4 9 0 7 0 3 7 0 3 0 2 3 0 5 0 我通
  • 可加载组件:异步加载组件失败

    我创建了模块 A 它是我的 React 应用程序的组件库 我计划在模块 B 上使用它 这是我实际的 React 应用程序 我有一个 index js 通过以下方式使用可加载组件从模块 A 导出我的组件 import loadable fro
  • ComboBoxModel 事件不起作用

    我似乎不理解事件等概念 在阅读了有关如何实现侦听器等内容的一段时间后 我发现 Java 教程说我应该扩展AbstractListModel触发数据事件 由于某种原因它仍然不起作用 我做错了什么吗 以及预计会出现什么样的代码addListDa
  • C++中如何处理bad_alloc?

    有一种方法叫做foo有时会返回以下错误 terminate called after throwing an instance of std bad alloc what std bad alloc Abort 有没有一种方法可以让我使用t
  • 将 mogenerator 集成到 Xcode 4 中

    在我的应用程序中 我使用核心数据来实现持久数据保存 因为我已经看到 mogenerator 提供了一种很好的方法来创建和维护NSManagedObject子类 也具有附加功能 我正在寻找一些在 Xcode 4 中集成 monogenerat
  • 如何将 CSS 应用到 Mac Chrome 选择框?

    无论我做什么 使用 Mac OSX 10 9 2 和 Chrome 版本 33 0 1750 152 padding background color 没有任何效果 我真的只是想申请一个padding top and padding bot
  • 直到用户输入匹配变量为止

    好的 所以我正在尝试创建一个用户名 密码登录脚本 可能不是我仍在研究的最安全的想法 我的脚本将加载变量以与这样的文件进行比较 现在我只是在研究密码部分 path to variables conf 该文件将包含一个名为的变量 PASS SO
  • C# 睡眠检测 PowerModeChanged

    我希望我的程序在计算机进入睡眠状态时写入控制台 但我无法这样做 我认为我设置错误 这是我所拥有的 编辑 新的 cs 文件 using LightFX using System using System Threading using Sys
  • 如何让 Pyglet 为 Python 3 工作?

    我很高兴能使用 Pyglet 因为它的所有功能 但是我在 Python 3 上安装 Pyglet 的最新开发版本时遇到问题 我知道人们已经问过这个问题 但没有一个回答对我有任何帮助 更新 我的意思是 我无法为 Python 3 安装 Pyg
  • 循环动态展开子网格 - JQGrid

    我有一个带有使用 subGridRowExpanded 的子网格的网格 我想动态扩展网格的一些行 所以我写了以下内容 在第一个网格的 GridComplete 事件中 ids 是我的网格的行 id 数组 for int i 0 i lt i
  • 截断轨道后无法使用原始数据

    问题是如果我使用然后我尝试打印它 我仍然看到所有 html 标签 truncate默认情况下转义字符串 但您可以使用将其关闭 escape option description truncate post content separator
  • 是否可以为简单的类创建表单

    我只是希望能够编辑不是 ActiveRecord 类的后继类的类属性 这是我的类 app model entry rb class Entry attr accessor title body end 这是一个控制器 class Diary
  • 惰性 IO - 字符串未被垃圾收集?

    我目前正在尝试将 XML 文件的内容读入Map Int Map Int String 而且效果很好 使用 HaXml 但是 我对程序的内存消耗不满意 问题似乎是垃圾收集 这是我用来读取 XML 文件的代码 type TextFile Map