2013-07-10 4 views
5

ハスケルのハードディスクから大きなグラフ構造を読みたい。グラフ構造は次のようになります。ハスケル遅延オープンファイルとクローズファイル

すべてのノードが定義持っている - ファイルの子供たちが何であるか記述し、それらがどのように(これらのグラフはData.Serializeを使用して直列化される接続されているが

すべてのノードは子を持つことができますので、場合。私は(<X>.nodeファイルやディレクトリの形で)Aノードの子を含むディレクトリAを持つことができ、ファイルA.nodeを持っている。

を私はメモリにハスケルとロードを使用して、このグラフをトラバースすることができるようにしたいとアンシリアライズにのみ必要例えば、もし私が例えばグラフを横切ってA->B->CBAなどの子)の場合、HaskellはファイルA.node,A/B.nodeおよびA/B/C.nodeを読み込む必要があります。次回グラフを走査したときに、ファイルはではなく、は既に読み込まれているはずです。

これを行うにはどうすればよいですか?

+0

読み込み中のファイルの内容を遅延させたい場合や、必要なときにのみファイルを開くようにしますか? – bennofs

+0

できるだけファイルを遅く開いて閉じたいです。 –

+0

何をしたいですか?ファイルの内容をキャッシュしますか?つまり、すでにファイルが読み込まれているときにファイルを再度読み込まないでください。あなたがやろうとしていることが私には悪い考えのように聞こえる場合、この種の並べ替えがあります。 [pipes](http://hackage.haskell.org/package/pipe)または[conduit](http://hackage.haskell.org/package/conduit) – bennofs

答えて

2

完全なディレクトリツリーを表す純粋な値を与え、実際に使用されているディレクトリとファイルのみを読み取るライブラリがあります。怠惰な評価のおかげで、そのようなファイルに2度目でアクセスすると、すでにメモリに格納されます。

directory-tree、特にreadDirectoryWithLの機能を確認してください。

+0

ありがとうございますが、私の目的にはうまくいくでしょうか?私はグラフ構造を持っているので、私は各ファイルを非公開にしたいと思っています。あなたはそれにアクセスしたときにファイルを読み込むと言ってきましたが、始めに、すべてのファイル(lazily)上でグラフ構造に対して "unserialize"を実行し、UNSERIALIZED GRAPHをトラバースするときだけ "読み込み"しますか? –

+0

はい、うまくいくはずです。ファイルの内容は他の遅延値と同じです。したがって、 'y = unserialize x'では、yが必要になるまで、xは評価されません(=ファイルは読み込まれません)。 – bennofs

+0

'directory-tree'には問題があります。**ファイル名を読むとファイルも読み込まれます**。ファイルの内容を読まずにファイル名を読むことは不可能です - これはこのライブラリの論理的なバグだと思います。サンプルコード:http://pastebin.com/ipbe8P3P追加 - 'iteratee 'のような何かを使って、この問題をどうにかして助けてくれるの? –

関連する問題