我試圖用Haskell將簡單(但非常大)的樹結構保存到二進制文件中。結構看起來是這樣的:如何將樹數據結構保存到Haskell中的二進制文件
-- For simplicity assume each Node has only 4 childs data Tree = Node [Tree] | Leaf [Int]這裏是我所需要的數據看磁盤上:
- 每個節點有4個32位偏移到它的孩子,然後按照孩子的開始。
- 我不太在乎葉子,假設它只有n個連續的32位數字。
- 對於實踐目的,我需要一些節點標籤或其他附加數據 但現在我不關心那麼多。
對我來說Haskellers編寫二進制文件時的首選是Data.Binary.Put庫。但是,由於我在第一號子彈中遇到了問題。特別是,當我要將節點寫入文件時,要寫下子偏移量,我需要知道當前的偏移量和每個子項的大小。
這不是Data.Binary.Put提供的東西,所以我認爲這必須是Monad變形金剛的完美應用。但即使聽起來很酷且功能強大,但迄今爲止,我還沒有采用這種方法取得成功。
我問了另外兩個問題,我認爲這會幫助我解決問題here和here。我必須說,每次我收到非常好的答案,都會幫助我進一步取得進展,但不幸的是,我仍然無法解決整個問題。
Here是我到目前爲止,它仍然泄漏太多的內存是實用的。
我很想擁有使用這種功能的方法的解決方案,但也會感激任何其他解決方案。
這棵樹有多大,你想象的文件大小是多少?這個答案決定了你是否可以使用任何類型的put類型結構,或者如果你需要一些涉及單遍遍歷但修改已經寫好的結構部分的東西...... – sclv 2011-03-01 18:36:43
二進制序列化通常需要知道尺寸要寫入的數據(例如列表以長度爲前綴)。你可以住文本序列化(可能是更大的文件)?如果不能通過寫入中間文件並將它們拼接在一起(可怕但可能)來做一些技巧。 同樣在你的測試代碼中,輸入是合成的 - 如果你的真實數據不是合成的,你可能會在內存中使用它,所以普通的二進制序列化不會強制任何不在堆中的東西。 – 2011-03-01 18:40:30
@sclv,上面提到的「我到目前爲止所擁有的東西」的鏈接指向我一直在研究一段時間的更大程序的摘錄。在原始程序中,我讀取了一個具有相似結構的二進制文件,對其進行轉換(主要是爲了節點上沒有太多的子節點),然後將其保存回去。源文件的大小介於50MB到200MB之間,所以我認爲目標文件的大小相似。 – 2011-03-01 22:23:48