2013-07-10 47 views
5

我想从Haskell中的硬盘读取大图结构。图结构是这样的:Haskell惰性打开和关闭文件

的每个节点都得到了一个定义 - 文件描述是什么孩子,他们如何连接(这些图表进行序列化使用Data.Serialize

每个节点可以有孩子所以,如果。我有文件A.node我可以有目录AA节点的孩子(在<X>.node文件和目录的形式)。

我希望能够遍历使用Haskell和负荷此图的内存和反序列化只需要如果我例如以的方式遍历图形(其中BA等的子),则Haskell应读取文件A.nodeA/B.nodeA/B/C.node。下次我遍历图时,文件应该再次被读取,因为我们已经做了NOT

我该如何做到最好?

+0

您是否想要正在阅读的文件的内容,或者只在需要时才打开文件? – bennofs

+0

如果可能,我想打开并关闭文件。 –

+0

你想做什么?您是否想要缓存文件内容,即在文件已被读取时不要再次读取文件?因为这种情况下,如果你想做的事听起来对我来说是一个坏主意。您可能想要使用[pipes](http://hackage.haskell.org/package/pipes)或[conduit](http://hackage.haskell.org/package/conduit) – bennofs

回答

2

有些库为您提供了一个纯粹的值,它代表了一个完整的目录树,并且只会读取实际使用的那些目录和文件。凭借懒惰的评估,你第二次访问这样的文件,它已经在内存中。

退房directory-tree,尤其是readDirectoryWithL功能。

+0

谢谢,但它会适合我的目的吗?我有一个图形结构 - 所以我想UNSERIALIZE每个文件懒惰。当我访问它时会告诉它将读取一个文件,但是我想在开始时将所有文件(延迟)的“反序列化”运行到一个图形结构,并且只有在遍历UNSERIALIZED GRAPH时才“读取”它们? –

+0

是的,这应该工作。文件内容就像任何其他懒惰值一样,所以在'y = unserialize x' x不计算(=文件不被读取)直到需要y。 – bennofs

+0

在读取文件名时,'directory-tree' - **有问题,文件也正在读取**。没有读取文件的内容就无法读取文件名 - 我认为这是该库中的一个逻辑错误。示例代码:http://pastebin.com/ipbe8P3P。另外 - 你使用像'iteratee'这样的想法会不会帮助解决这个问题? –