2013-07-10 11 views
5

Chcę przeczytać dużą strukturę wykresu z dysku twardego w Haskell. Struktura wykres wygląda następująco:Haskell leniwy otwieranie i zamykanie plików

Każdy węzeł ma definicji - plik opisujący jakie są dzieci i jak są one podłączone (te wykresy są szeregowane za pomocą Data.Serialize

Każdy węzeł może mieć dzieci, więc jeśli.. mam plik A.node mogę mieć katalog zawierający A dzieci A węzła (w postaci <X>.node plików i katalogów).

Chcę być w stanie przemierzać ten wykres używając Haskell i obciążenia do pamięci i unserialize tylko potrzebne Jeśli przejdę na przykład do wykresu na drodze A->B->C (gdzie B jest potomkiem A itd.), Następnie Haskell powinien przeczytać pliki A.node, A/B.node i A/B/C.node. Następnym razem, gdy przejdę przez wykres, pliki powinny być ponownie przeczytane, ponieważ zrobiliśmy to już.

Jak mogę to zrobić w najlepszy sposób?

+0

Czy chcesz, aby zawartość plików była odczytywana leniwie, czy tylko otwierać plik w razie potrzeby? – bennofs

+0

Chcę otworzyć i zamknąć plik leniwie, jeśli jest to możliwe. –

+0

Co chcesz zrobić? Czy chcesz buforować zawartość pliku, tzn. Nie czytać ponownie tego pliku, gdy został już odczytany? Ponieważ to, co próbujesz zrobić, brzmi dla mnie jak zły pomysł. Prawdopodobnie chcesz użyć czegoś takiego jak [pipe] (http://hackage.haskell.org/package/pipes) lub [conduit] (http://hackage.haskell.org/package/conduit) – bennofs

Odpowiedz

2

Istnieją biblioteki, które dają czystą wartość reprezentującą pełne drzewo katalogów i będą tylko czytać te katalogi i pliki, które są faktycznie używane. Dzięki leniwej ocenie, za drugim razem, gdy uzyskasz dostęp do takiego pliku, będzie on już przechowywany w pamięci.

Zapoznaj się z directory-tree, zwłaszcza z funkcją readDirectoryWithL.

+0

Dziękuję, ale czy dobrze by działało dla moich celów? Mam strukturę wykresów - więc chcę UNSERIALIZOWAĆ KAŻDEGO PLIKU LAZILNIE. Powiedziałeś, że odczyta plik, gdy uzyska do niego dostęp, ale na początku chcę uruchomić "unserializację" wszystkich plików (leniwie) do struktury wykresu i "odczytać" je tylko podczas przechodzenia przez UNSERIALIZED GRAPH? –

+0

Tak, to powinno zadziałać. Zawartość pliku jest podobna do każdej innej leniwej wartości, więc w 'y = unserialize x' x nie jest oceniany (= plik nie jest czytany), dopóki y nie jest potrzebne. – bennofs

+0

Występuje problem z 'katalog-drzewo' - ** podczas odczytu nazwy pliku, plik jest również odczytywany **. Niemożliwe jest odczytanie nazwy pliku bez czytania zawartości pliku - myślę, że jest to logiczny błąd w tej bibliotece. Przykładowy kod: http://pastebin.com/ipbe8P3P. Dodatkowe - czy w jakiś sposób użycie czegoś takiego jak 'iteratee' mogłoby w jakiś sposób pomóc w rozwiązaniu tego problemu? –