【问题标题】:Haskell lazy open and close filesHaskell 懒惰打开和关闭文件
【发布时间】:2013-07-10 12:08:04
【问题描述】:

我想在 Haskell 中从硬盘读取一个大的图形结构。图结构如下所示:

每个节点都有一个定义 - 一个描述什么是子节点以及它们如何连接的文件(这些图使用Data.Serialize 进行序列化。

每个节点都可以有子节点。因此,如果我有文件 A.node 我可以拥有包含 A 节点的子节点的目录 A(以 <X>.node 文件和目录的形式)。

我希望能够使用 Haskell 遍历此图并加载到内存并反序列化仅需要的文件。因此,如果我以A->B->C 的方式遍历图形(其中BA 等的子级),那么Haskell 应该读取文件A.nodeA/B.nodeA/B/C.node。下次我遍历图表时,应该再次读取文件,因为我们已经这样做了。

我怎样才能做到最好?

【问题讨论】:

  • 你是想要懒惰地读取文件的内容还是只在需要时才打开文件?
  • 如果可能的话,我想懒洋洋地打开和关闭文件。
  • 你想做什么?是否要缓存文件内容,即当文件已被读取时不再读取?因为这种如果你想做的事情对我来说听起来是个坏主意。你可能想使用类似pipesconduit
  • @bennofs - 你说得对 - 我的问题不清楚 - 我已经编辑它以准确显示我正在尝试做的事情。

标签: file haskell io lazy-evaluation


【解决方案1】:

有些库会为您提供代表完整目录树的纯值,并且只会读取实际使用的目录和文件。凭借惰性求值,您第二次访问此类文件时,它已经在内存中了。

查看directory-tree,尤其是readDirectoryWithL 函数。

【讨论】:

  • 谢谢,但它对我的目的有用吗?我有一个图形结构 - 所以我想懒惰地取消序列化每个文件。你已经告诉它在我访问它时会读取一个文件,但我想在开始时对所有文件(懒惰地)运行“反序列化”到一个图形结构,并且只有在遍历 UNSERIALIZED GRAPH 时才“读取”它们?
  • 是的,应该可以。文件内容就像任何其他惰性值一样,因此在y = unserialize x 中,x 不会被评估(= 文件未被读取),直到需要 y。
  • directory-tree 有问题 - 在读取文件名时,文件也在被读取。不读取文件内容就不可能读取文件名——我认为这是这个库中的一个逻辑错误。示例代码:pastebin.com/ipbe8P3P。附加 - 您是否使用诸如 iteratee 之类的想法会以某种方式帮助解决这个问题?
  • @danilo2:您是否在github.com/jberryman/directory-tree/issues 提交了错误?
  • @JoachimBreitner 我昨天已经给作者发了一封邮件——现在就提交了这个错误。
猜你喜欢
  • 2015-09-06
  • 2014-03-23
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2015-09-06
  • 2012-02-20
  • 2016-12-14
  • 1970-01-01
相关资源
最近更新 更多