2013-07-10 14 views
5

Ich möchte eine große Grafikstruktur von der Festplatte in Haskell lesen. Die Graphstruktur sieht wie folgt aus:Haskell faul Öffnen und Schließen von Dateien

Jeder Knoten hat eine Definition bekam - eine Datei beschreiben, was die Kinder sind und wie sind sie verbunden (diese Graphen sind serialisiert Data.Serialize mit

Jeder Knoten Kinder haben Also, wenn.. ich habe Datei bekam A.node ich A Verzeichnis haben Kinder von A Knoten (in Form von <X>.node Dateien und Verzeichnisse) enthält.

ich möchte diese Grafik in der Lage sein mit Haskell und Last-Speicher zu durchqueren und unserialize nur benötigt, Wenn ich zum Beispiel das Diagramm in der Art vondurchquere(wobei B Kind von A usw. ist), dann sollte Haskell die Dateien A.node, A/B.node und A/B/C.node lesen. Das nächste Mal, wenn ich das Diagramm durchquere, sollten die Dateien NICHT wieder gelesen werden, weil wir es schon getan haben.

Wie kann ich das am besten machen?

+0

Wollen Sie Inhalte der Dateien lesen, die gerade gelesen werden oder nur die Datei öffnen, wenn sie benötigt werden? – bennofs

+0

Ich möchte die Datei faul öffnen und schließen, wenn es möglich ist. –

+0

Was möchten Sie tun? Möchten Sie den Inhalt der Datei zwischenspeichern, d. H. Die Datei nicht erneut lesen, wenn sie bereits gelesen wurde? Denn diese Art von Dingen, die du versuchst zu tun, klingt für mich wie eine schlechte Idee. Sie möchten wahrscheinlich etwas wie [pipes] (http://hackage.haskell.org/package/pipes) oder [conduit] verwenden (http://hackage.haskell.org/package/conduit) – bennofs

Antwort

2

Es gibt Bibliotheken, die Ihnen einen reinen Wert geben, der eine vollständige Verzeichnisstruktur darstellt und nur die Verzeichnisse und die Datei liest, die tatsächlich verwendet werden. Aufgrund der Lazy-Evaluierung wird das zweite Mal, wenn Sie auf eine solche Datei zugreifen, bereits im Speicher gespeichert.

Auschecken directory-tree, vor allem die readDirectoryWithL Funktion.

+0

Danke, aber würde es gut für meine Zwecke funktionieren? Ich habe eine Graphenstruktur - also möchte ich jede Datei unleserlich machen. Sie haben gesagt, es wird eine Datei lesen, wenn ich darauf zugreife, aber ich möchte am Anfang "unserialisieren" auf allen Dateien (träge) zu einer Graphenstruktur ausführen und sie "nur" lesen, wenn wir das UNSERALIZED GRAPH durchqueren? –

+0

Ja, das sollte funktionieren. Der Dateiinhalt ist genau wie jeder andere Lazy-Wert, also wird in 'y = unserialize x' x nicht ausgewertet (= die Datei wird nicht gelesen), bis y benötigt wird. – bennofs

+0

Es gibt ein Problem mit 'Verzeichnisbaum' - ** beim Lesen des Dateinamens, die Datei wird auch gelesen **. Es ist unmöglich, den Dateinamen zu lesen, ohne den Inhalt der Datei zu lesen - ich denke, das ist ein logischer Fehler in dieser Bibliothek. Der Beispielcode: http://pastebin.com/ipbe8P3P. Zusätzlich - würdest du etwas wie "iteratee" benutzen, um irgendwie mit diesem Problem zu helfen? –

Verwandte Themen