2013-07-10 32 views
5

Tôi muốn đọc cấu trúc biểu đồ lớn từ đĩa cứng trong Haskell. Cấu trúc đồ thị trông như thế này:Các tập tin mở và đóng của Haskell lười biếng

Mỗi nút đã có một định nghĩa - một tập tin mô tả những đứa trẻ là gì và làm thế nào họ kết nối (các đồ thị được serialized sử dụng Data.Serialize

Mỗi nút có thể có con Vì vậy, nếu.. tôi đã có tập tin A.node tôi có thể có thư mục chứa A trẻ em của A nút (theo hình thức <X>.node tập tin và thư mục).

tôi muốn để có thể đi qua biểu đồ này sử dụng Haskell và tải vào bộ nhớ và unserialize chỉ cần Vì vậy, nếu tôi ví dụ đi qua biểu đồ theo cách của A->B->C (trong đó B là con của A v.v.), thì Haskell sẽ đọc các tệp A.node, A/B.nodeA/B/C.node. Lần sau tôi duyệt qua biểu đồ, các tệp cần NOT được đọc lại, vì chúng tôi đã làm nó rồi.

Làm cách nào để tôi thực hiện điều này một cách tốt nhất?

+0

Bạn có muốn nội dung của các tệp đang được đọc không cần thiết hay chỉ mở tệp khi cần? – bennofs

+0

Tôi muốn mở và đóng tệp một cách lười biếng nếu có thể. –

+0

Bạn muốn làm gì? Bạn có muốn lưu trữ nội dung tệp, tức là không đọc lại tệp khi nó đã được đọc chưa? Bởi vì kiểu này nếu bạn đang cố gắng làm âm thanh như một ý tưởng tồi với tôi. Bạn có thể muốn sử dụng một cái gì đó như [ống] (http://hackage.haskell.org/package/pipes) hoặc [ống dẫn] (http://hackage.haskell.org/package/conduit) – bennofs

Trả lời

2

Có thư viện cung cấp cho bạn giá trị thuần túy đại diện cho cây thư mục đầy đủ và sẽ chỉ đọc những thư mục và tệp đó thực sự được sử dụng. Nhờ đánh giá lười biếng, lần thứ hai bạn truy cập vào một tệp như vậy mà nó đã có trong bộ nhớ.

Kiểm tra directory-tree, đặc biệt là chức năng readDirectoryWithL.

+0

Cảm ơn bạn, nhưng nó có hoạt động tốt cho mục đích của tôi không? Tôi đã có một cấu trúc đồ thị - vì vậy tôi muốn UNSERIALIZE MỌI TƯƠNG LAI. Bạn đã nói nó sẽ đọc một tệp khi tôi truy cập nó, nhưng tôi muốn bắt đầu chạy "unserialize" trên tất cả các tệp (lazily) vào một cấu trúc biểu đồ và "đọc" chúng khi duyệt qua đối tượng UNSERIALIZED? –

+0

Có, điều đó sẽ hiệu quả. Nội dung tập tin cũng giống như bất kỳ giá trị lười biếng nào khác, vì vậy trong 'y = unserialize x' x không được đánh giá (= tệp không được đọc) cho đến khi y là cần thiết. – bennofs

+0

Có sự cố với 'thư mục-cây' - ** khi đọc tên tệp, tệp cũng đang được đọc **. Không thể đọc được tên tệp mà không đọc nội dung của tệp - tôi nghĩ đây là lỗi hợp lý trong thư viện này. Mã mẫu: http://pastebin.com/ipbe8P3P. Bổ sung - bạn có điều gì sử dụng somethink như 'iteratee' sẽ giúp đỡ với vấn đề này bằng cách nào đó? –

Các vấn đề liên quan