2010-10-27 24 views
6

Tôi đang sử dụng Nokogiri làm việc cho các tài liệu nhỏ. Nhưng đối với một tệp HTML 180KB tôi phải tăng kích thước ngăn xếp quy trình, thông qua ulimit -s và các truy vấn phân tích cú pháp và XPath mất một thời gian dài.Trình phân tích cú pháp XML nhanh cho Ruby là gì?

Có phương pháp nhanh hơn nào bằng cách sử dụng phân phối Ruby cổ phiếu không?

Tôi quen với XPath, nhưng giải pháp này không nhất thiết phải hỗ trợ XPath.

Các tiêu chí là:

  1. nhanh để viết.
  2. Thực thi nhanh.
  3. Trình phân tích cú pháp kết quả mạnh mẽ.
+0

nokogiri là đá quý nhanh nhất hiện tại – s84

+0

Tôi tìm thấy bò tốt hơn nokogiri –

Trả lời

6

Nokogiri dựa trên libxml2, là một trong những trình phân tích cú pháp XML/HTML nhanh nhất trong bất kỳ ngôn ngữ nào. Nó được viết bằng C, nhưng có những ràng buộc bằng nhiều ngôn ngữ.

Vấn đề là tệp càng phức tạp, càng mất nhiều thời gian để xây dựng cấu trúc DOM hoàn chỉnh trong bộ nhớ. Tạo một DOM là chậm hơn và nhiều bộ nhớ đói hơn so với các phương pháp phân tích cú pháp khác (nói chung toàn bộ DOM phải phù hợp với bộ nhớ). XPath dựa trên DOM này.

SAX thường là những gì mọi người chuyển sang cho tốc độ hoặc tài liệu lớn không vừa với bộ nhớ. Đó là sự kiện được định hướng nhiều hơn: nó thông báo cho bạn về một phần tử bắt đầu, phần tử kết thúc, v.v. và bạn viết các trình xử lý để phản ứng với chúng. Đó là một chút đau đớn bởi vì bạn sẽ tự theo dõi trạng thái của mình (ví dụ: các yếu tố bạn "bên trong").

Có nền tảng trung gian: một số trình phân tích cú pháp có khả năng "phân tích cú pháp kéo" nơi bạn có điều hướng giống con trỏ. Bạn vẫn truy cập từng nút một cách liên tục, nhưng bạn có thể "tua đi" tới phần cuối của phần tử mà bạn không quan tâm. Nó có tốc độ SAX nhưng giao diện tốt hơn cho nhiều lần sử dụng. Tôi không biết Nokogiri có thể làm điều này cho HTML hay không, nhưng tôi sẽ xem xét số Reader API nếu bạn quan tâm.

Lưu ý rằng Nokogiri cũng rất khoan dung với đánh dấu không đúng định dạng (chẳng hạn như HTML trong thế giới thực) và điều này một mình làm cho nó trở thành một lựa chọn rất tốt cho phân tích cú pháp HTML.

+0

nokogiri không quá nhanh như mong đợi. ngay bây giờ tôi có một vấn đề với phân tích cú pháp tệp XML lớn. Tôi không thực sự biết có bao nhiêu hồ sơ trong tập tin nhưng kích thước của tập tin là 7.2mb. vì vậy khi tôi cố gắng phân tích - nokogiri bị treo cứng. và bị rò rỉ bộ nhớ – ajahongir

+0

Tôi muốn được quan tâm đến khả năng này. _ "nhanh về phía trước" đến cuối phần tử mà bạn không quan tâm đến_ liệu Nokogiri SAX có mặc dù vậy không? –

+0

@HarryWood SAX là một API có dạng vani đơn giản như bạn có thể nhận được. Tuy nhiên, hãy xem gem [saxerator] (https://github.com/soulcutter/saxerator) sử dụng SAX dưới mui xe và về cơ bản sẽ nhanh chóng chuyển tiếp đến một phần tử bạn đang tìm kiếm và liệt kê các mục ở đó. –

0

Bạn có thể thấy rằng đối với tài liệu XML lớn hơn Phân tích cú pháp DOM không thực sự hiệu quả. Điều này là do trình phân tích cú pháp phải xây dựng một bản đồ trong bộ nhớ của cấu trúc của tài liệu XML.

Cách tiếp cận khác thường đòi hỏi một dấu chân bộ nhớ nhỏ hơn là sử dụng trình phân tích cú pháp SAX theo hướng sự kiện.

Nokogiri có hỗ trợ đầy đủ cho SAX.

15

Kiểm tra đá quý Ox. Nó nhanh hơn LibXML và Nokogiri và hỗ trợ trong phân tích bộ nhớ cũng như phân tích cú pháp gọi lại SAX. Tiết lộ đầy đủ, tôi đã viết nó.


Trong so sánh hiệu suất http://www.ohler.com/software/thoughts/Blog/Entries/2011/9/21_XML_with_Ruby.html cả hai trình phân tích cú pháp DOM (trong bộ nhớ) và SAX (gọi lại) được so sánh.

+0

Hm, bạn có muốn thêm liên kết vào nó không? – maxschlepzig

+1

Tôi đã sử dụng Ox, và tôi đã rất hài lòng với nó (https://github.com/ohler55/ox) –

+0

Tôi có thể có thêm tài liệu về cách sử dụng như nút, cdata trong ox gem? –

0

Tùy thuộc vào môi trường của bạn, Oga có thể phù hợp hơn như một nhanh đủ parsers XML cho Ruby với một giao diện tốt hơn và thời gian lắp đặt nhanh.

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