大量的XML编辑

时间:2013-12-16 04:33:32

标签: haskell

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

我正在努力解决架构/图书馆问题,并正在寻找建议。

到目前为止,我已经提出了这个问题 -

我正在为此寻找理想的XML库,到目前为止,我还没有发现任何符合该法案的内容。这些库通常在Haskell列表中存储节点,在Haskell Data.Text对象中存储文本。这只允许线性节点和文本插入,我相信Text插入必须在每次插入/删除时进行完全重写。

我认为在序列中存储节点和文本似乎是要走的路....它支持log(N)插入和删除,并且只需要在每次更改时重写树的一小部分。虽然没有XML库是基于此的,所以我必须编写自己的lib,或者只使用其他库中的一个来解析然后将其转换为我自己的形式(考虑到解析XML是多么容易,我几乎就像前者一样,而不是对所有事物进行阴影解析。)

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

总结 -

  1. Haskell是否是正确的选择?

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

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

1 个答案:

答案 0 :(得分:1)

我会回答我自己的问题 -

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

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