大量 XML 编辑

2024-03-22

我需要将一个中等大小的 XML 文件加载到内存中,对该文件进行多次随机访问修改(可能是数十万次),然后将结果写入 STDIO。大多数这些修改将是节点插入/删除,以及文本节点内的字符插入/删除。这些 XML 文件足够小,可以放入内存,但也足够大,我不想保留多个副本。

我正在尝试确定架构/库并寻求建议。

这是我到目前为止所想出的-

我正在为此寻找理想的 XML 库,但到目前为止,我还没有找到任何似乎符合要求的东西。这些库通常将节点存储在 Haskell 列表中,将文本存储在 Haskell Data.Text 对象中。这仅允许线性节点和文本插入,并且我相信文本插入必须在每次插入/删除时进行完全重写。

我认为按顺序存储节点和文本似乎是正确的方法......它支持 log(N) 插入和删除,并且只需要在每次更改时重写树的一小部分。不过,没有一个 XML 库基于此,因此我必须编写自己的库,或者仅使用其他库之一进行解析,然后将其转换为我自己的形式(考虑到解析 XML 是多么容易,我几乎会和前者一样快,而不是对所有内容进行影子解析)。

我曾简要考虑过这种可能性,即这可能是一种罕见的情况,Haskell 可能不是最好的工具......但后来我意识到可变性在这里并没有提供太多优势,因为我的修改不是字符替换,而是添加/删除。如果我用 C 语言编写此代码,我仍然需要将字符串/节点存储在某种树结构中,以避免每次插入/删除时进行大字节移动。 (实际上,Haskell 可能有一些最好的工具来处理这个问题,但如果你觉得有一个更好的语言选择来完成这项任务,我愿意接受建议)。

总结一下——

  1. Haskell 是正确的选择吗?

  2. 是否有 Haskell 库支持快速节点/文本插入/删除 (log(N))?

  3. 序列是存储项目列表(在我的例子中是节点和字符)以进行快速插入和删除的最佳数据结构吗?


我会回答我自己的问题-

我选择使用一个自定义对象来包装 Text.XML 树,该对象将节点和文本存储在 Data.Sequence 对象中。因为 haskell 很懒,所以我相信它只是暂时将 Text.XML 数据保存在内存中,随着数据流的逐个节点,然后在我实际开始修改序列树的任何实际工作之前,它会被垃圾收集。

(如果这里有人可以验证这就是 Haskell 在内部工作的方式,那就太好了,但我已经实现了一些东西,并且性能似乎是合理的,不是很好 - 每秒大约 30k 插入/删除,但这应该可以) 。

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

大量 XML 编辑 的相关文章

  • 你在实际项目中使用过Quickcheck吗[关闭]

    Closed 这个问题是基于意见的 help closed questions 目前不接受答案 快速检查 http www cs chalmers se rjmh QuickCheck 及其变体 即使有一个Java https bitbuc
  • 哪个 Haskell 计算机图形几何库?

    我想用 Haskell 做一些计算机图形学实验 这将包括进行一些几何计算并最终编写光线追踪器 我应该选择哪个库来轻松处理向量 矩阵及其相关操作 Hackage 上很少有包括像这样好看的vect http hackage haskell or
  • 是否可以对更高种类类型的类实例强制执行类型约束?

    我有一个这样定义的类型 newtype PrimeSet a P Integer deriving Eq 我还定义了一个将素数集转换为列表的函数 假设它的类型参数是Integral toList Integral a gt PrimeSet
  • Foldl 是否比其严格的表亲 Foldl' 更好?

    Haskell 有两个列表左折叠函数 foldl 以及 严格 版本 foldl 不严格的问题foldl是它建造了一座重击塔 foldl 0 1 5 gt 0 1 2 3 4 5 gt 15 这会浪费内存 并且如果列表中的项太多 可能会导致堆
  • XMonad 在不同工作区启动

    我想在 xmonad start 上启动不同工作区中的一些应用程序 这很重要 所以 我写了以下内容startupHook startupApps String startupApps konsole emacs firefox gvim k
  • 我需要什么类型签名才能将函数列表转换为 Haskell 代码? [复制]

    这个问题在这里已经有答案了 可能的重复 为什么 haskell 中不允许这样的函数定义 https stackoverflow com questions 6168880 why is such a function definition
  • 由于标志字节串 -lt-0_10_4,无法使用 Stack 构建 hello world 程序

    通过生成一个裸露的 hello world 项目 stack new myproject simple 每当我跑步时stack setup stack init or stack build我总是出现以下错误 Downloading lts
  • Haskell 中的异构多态性(正确方法)

    让一个模块来抽象Area操作 错误的定义 class Area someShapeType where area someShapeType gt Float module utilities sumAreas Area someShape
  • Accelerate 和 Repa 是否有不同的用例?

    我一直在玩 Repa 和 Accelerate 它们都很有趣 但我不知道何时使用其中一个 何时使用另一个 他们是一起成长 是竞争对手 还是只是为了解决不同的问题 Repa 是一个用于高效数组构建和遍历的库 用 Haskell 编程并在 Ha
  • 显示未定义的实例

    可以采取任何措施来为未定义的值定义 Show 实例吗 也许存在一些 GHC 扩展 我想要这样的东西 gt print 1 undefined 1 undefined 根据Haskell 2010 报告 第 9 章 http www hask
  • Haskell 中美元符号 ($) 和 id 函数之间有关系吗?

    这几天我正在读一篇评论莫纳德挑战 http mightybyte github io monad challenges 我强烈推荐给像我这样的 Haskell 初学者 我最终得到了这个线程 https news ycombinator co
  • Haskell,optparse-generic 的未命名命令行参数

    我在用着optparse 通用 https hackage haskell org package optparse generic解析名为的程序的命令行参数example 我有一个带有命名字段的数据类型 记录语法 例如 data Exam
  • 类 GADT 类型变量的未来角色?

    A 昨天的问题 https stackoverflow com q 41135212 3072788有一个定义HList 来自HList https hackage haskell org package HList 0 4 1 0 doc
  • 将系统命令的结果绑定到 Haskell 中的变量

    如何在 Haskell 中运行系统命令and将其结果 即标准输出 绑定到变量 在伪 Haskell 中 我正在寻找类似以下内容的内容 import System Process main do output lt callCommand e
  • 访问函数中的环境

    In main我可以读取我的配置文件 并将其提供为runReader somefunc myEnv正好 但somefunc不需要访问myEnv读者提供 链中的下一对也没有提供 需要 myEnv 中某些内容的函数是一个微小的叶函数 如何在不将
  • 如何让 Show 显示函数名称?

    作为一个让我熟悉 Haskell 的简单练习 在 Youtube 上闲逛并偶然进入美国倒计时游戏节目之后 我想为数字游戏制作一个求解器 你得到 6 个数字 需要将它们与 为了得到给定的结果 到目前为止我所得到的是非常脑死亡的 let ope
  • 这个记忆的斐波那契函数是如何工作的?

    在我正在做的函数式编程课程的当前练习作业中 我们必须制作给定函数的记忆版本 为了解释记忆化 给出以下示例 fiblist fibm x x lt 0 fibm 0 0 fibm 1 1 fibm n fiblist n 1 fiblist
  • Haskell 类型系统的细微差别

    我一直在深入了解 haskell 类型系统的本质 并试图了解类型类的要点 我已经学到了很多东西 但我在下面的代码片段上遇到了困难 使用这些类和实例定义 class Show a gt C a where f Int gt a instanc
  • 为什么 Haskell 的默认字符串实现是一个字符链接列表?

    Haskell 默认值的事实String众所周知 实现在速度和内存方面都效率不高 据我所知 lists一般来说 在 Haskell 中实现为单链表 并且适用于大多数小型 简单数据类型 例如Int 这似乎不是一个好主意 但是对于String这
  • Haskell 下划线与显式变量

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

随机推荐