2013-12-16 51 views
2

我需要將一箇中等大小的XML文件加載到內存中,對該文件進行許多隨機訪問修改(可能成千上萬),然後將結果寫入STDIO。大多數這些修改將是節點插入/刪除,以及文本節點內的字符插入/刪除。這些XML文件將足夠小以適應內存,但足夠大以至於我不想保留多個副本。大量的XML編輯

我想解決的架構/圖書館,我正在尋找建議。

以下是我想出了這麼遠

我尋找這個理想XML庫,到目前爲止,我還沒有發現任何東西,似乎符合該法案。這些庫通常將節點存儲在Haskell列表中,並將文本存儲在Haskell Data.Text對象中。這隻允許線性節點和文本插入,並且我相信文本插入必須在每次插入/刪除時完全重寫。

我認爲序列中存儲節點和文本似乎是要走的路....它支持log(N)插入和刪除,並且只需要在每次更改時重寫一小部分樹。 XML庫都不是基於此,所以我將不得不編寫自己的庫,或者只是使用其他庫中的一個來解析,然後將其轉換爲我自己的形式(鑑於解析XML是多麼容易,我幾乎就和前者一樣,而不是對所有東西進行陰影解析)。

我曾經簡單地考慮過這種可能性,這可能是罕見的情況下Haskell可能不是最好的工具....但後來我意識到可變性在這裏沒有提供很多優勢,因爲我的修改不是' t字符替換,而是添加/刪除。如果我用C語言寫這個,我仍然需要以某種樹形結構存儲字符串/節點,以避免每次插入/刪除時出現大的字節移動。 (實際上,Haskell可能有一些最好的工具來處理這個問題,但如果你覺得有一個更好的選擇,我會接受更好的語言選擇。

要summarize-

  1. 哈斯克爾是正確的選擇這個?

  2. Haskell lib是否支持快速節點/文本插入/刪除(log(N))?

  3. 是序列最好的數據結構來存儲項目列表(在我的情況下,節點和字符)快速插入和刪除?

回答

1

我會回答我自己question-

我選擇了換一個Text.XML樹與存儲節點和文本Data.Sequence對象的自定義對象。因爲haskell是懶惰的,我相信它只暫時保存內存中的Text.XML數據,逐個節點地存儲數據流,然後在我真正開始修改序列樹的任何實際工作之前,它被垃圾收集。如果某人在這裏可以驗證Haskell是如何在內部工作的,但是我已經實現了一些東西,而且性能似乎是合理的,並不是很好 - 每秒大約30k次插入/刪除,但這會很好,但是這應該做)。