我需要将一个中等大小的 XML 文件加载到内存中,对该文件进行多次随机访问修改(可能是数十万次),然后将结果写入 STDIO。大多数这些修改将是节点插入/删除,以及文本节点内的字符插入/删除。这些 XML 文件足够小,可以放入内存,但也足够大,我不想保留多个副本。
我正在尝试确定架构/库并寻求建议。
这是我到目前为止所想出的-
我正在为此寻找理想的 XML 库,但到目前为止,我还没有找到任何似乎符合要求的东西。这些库通常将节点存储在 Haskell 列表中,将文本存储在 Haskell Data.Text 对象中。这仅允许线性节点和文本插入,并且我相信文本插入必须在每次插入/删除时进行完全重写。
我认为按顺序存储节点和文本似乎是正确的方法......它支持 log(N) 插入和删除,并且只需要在每次更改时重写树的一小部分。不过,没有一个 XML 库基于此,因此我必须编写自己的库,或者仅使用其他库之一进行解析,然后将其转换为我自己的形式(考虑到解析 XML 是多么容易,我几乎会和前者一样快,而不是对所有内容进行影子解析)。
我曾简要考虑过这种可能性,即这可能是一种罕见的情况,Haskell 可能不是最好的工具......但后来我意识到可变性在这里并没有提供太多优势,因为我的修改不是字符替换,而是添加/删除。如果我用 C 语言编写此代码,我仍然需要将字符串/节点存储在某种树结构中,以避免每次插入/删除时进行大字节移动。 (实际上,Haskell 可能有一些最好的工具来处理这个问题,但如果你觉得有一个更好的语言选择来完成这项任务,我愿意接受建议)。
总结一下——
Haskell 是正确的选择吗?
是否有 Haskell 库支持快速节点/文本插入/删除 (log(N))?
序列是存储项目列表(在我的例子中是节点和字符)以进行快速插入和删除的最佳数据结构吗?
我会回答我自己的问题-
我选择使用一个自定义对象来包装 Text.XML 树,该对象将节点和文本存储在 Data.Sequence 对象中。因为 haskell 很懒,所以我相信它只是暂时将 Text.XML 数据保存在内存中,随着数据流的逐个节点,然后在我实际开始修改序列树的任何实际工作之前,它会被垃圾收集。
(如果这里有人可以验证这就是 Haskell 在内部工作的方式,那就太好了,但我已经实现了一些东西,并且性能似乎是合理的,不是很好 - 每秒大约 30k 插入/删除,但这应该可以) 。
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)