2012-03-30 34 views
11

Tôi mới dùng Clojure và dự án đầu tiên của tôi phải xử lý tệp XML khổng lồ (250 + GB). Tôi muốn đưa nó vào PostgreSQL để xử lý sau này, nhưng không có ý tưởng làm thế nào để tiếp cận một tập tin lớn như vậy.XML khổng lồ ở Clojure

+1

Bắt đầu bằng cách hiểu cách tiếp cận một tệp nhỏ, sau đó làm việc. –

+5

XML này trông như thế nào? Cao arborescent hoặc một bộ sưu tập phẳng của nhiều mặt hàng? – cgrand

+4

Arborescent - từ tuyệt vời! +1 –

Trả lời

18

Tôi đã sử dụng clojure.data.xml mới để xử lý kết xuất Wikipedia 31GB trên máy tính xách tay khiêm tốn. Thư viện cộng đồng cũ lazy-xml không hoạt động đối với tôi (hết bộ nhớ).

https://github.com/clojure/data.xml

Giản mã ví dụ:

(require '[clojure.data.xml :as data.xml]) ;' 

(defn process-page [page] 
    ;; ... 
) 

(defn page-seq [rdr] 
    (->> (:content (data.xml/parse rdr)) 
     (filter #(= :page (:tag %))) 
     (map process-page))) 
+0

vì vậy đây là những gì @ivant đề cập đến? thực hiện clojure io cho lười biếng-xml bị hỏng bằng cách nào đó? –

+0

Có, nó có vấn đề.Tất cả, đó là một phần của contrib clojure cũ và không được chấp nhận '' data.xml' là sự thay thế –

+0

OK - Tôi đã dành một vài giờ cố gắng tất cả các có thể kết hợp của ((())) nhưng không thành công.Tôi nhận được StackOverflow Lỗi và nó - như tôi hiểu nó - bởi vì tôi sử dụng này: '(with-open [rdr (BufferedReader. (FileReader.))] ' và nên sử dụng một số luồng đầu vào, nhưng tôi mới sử dụng Clojure và sau vài giờ đó ... Bạn có thể trợ giúp không? – trzewiczek

2

chế biến xml khổng lồ thường được thực hiện với SAX, trong trường hợp Clojure đây là http://richhickey.github.com/clojure-contrib/lazy-xml-api.html

thấy (phân tích-seq File/InputStream/URI)

+0

API có thể hơi lười, nhưng IO thì không, vì vậy tôi nghi ngờ nó sẽ hoạt động trên một tệp có kích thước đó. – ivant

+2

@ivant bạn kết nối nó với luồng đầu vào đọc dữ liệu theo từng bước. đó là thực hành tiêu chuẩn để xử lý các tệp xml lớn trong java. –

+0

xem câu trả lời của Justin để giải thích về những gì ivant có thể đề cập đến ở đây. –

0

Nếu xml là một tập hợp các hồ sơ, https://github.com/marktriggs/xml-picker-seq là những gì bạn cần để xử lý các bản ghi trong xml bất kể kích thước xml là bao nhiêu. Nó sử dụng XOM dưới mui xe và xử lý một 'bản ghi' tại một thời điểm.

+0

Tôi cũng đã thử điều đó nhưng không thành công. Tôi có nghĩa là - nó đã làm các trick về các tập tin rất lớn, nhưng tôi không thể nhận được các reasults với xpath truy vấn - kết quả sản phẩm nào đi ra khỏi nó. Truy vấn xpath duy nhất hoạt động là ".", Nhưng nó không phải là những gì tôi muốn ... Không thể quản lý vấn đề này nhiều hơn sau đó hai giờ ... :( – trzewiczek

0

Bạn cũng có thể sử dụng phân tích cú pháp XML expresso cho các tập tin khổng lồ (www.expressoxml.com). Nó có thể phân tích các tập tin của 36GB và nhiều hơn nữa vì nó không bị giới hạn bởi kích thước tập tin. Nó có thể trở lại lên đến 230.000 yếu tố từ một tìm kiếm và nó có sẵn thông qua streaming trên "đám mây" từ trang web của họ. Và tốt nhất của tất cả các phiên bản phát triển của họ là miễn phí.

+2

Mặc dù bạn chưa cố gắng che giấu quảng cáo này dưới dạng tư vấn khách quan, tốt nhất bạn nên nêu rõ liên kết mạnh mẽ của mình với sản phẩm đó. https://twitter.com/Lughnasagh/status/260387856772653056. –

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