2010-11-15 25 views
6

Hiện tại tôi đang triển khai một máy khách REST để phân tích các thông điệp phản hồi XML. Dự định, sau này sẽ được chạy trên thiết bị Android. Do đó, bộ nhớ và tốc độ xử lý là một vấn đề khá. Tuy nhiên, sẽ chỉ có một đáp ứng XML tại một thời điểm để xử lý hoặc giữ nhiều tài liệu XML tại một thời điểm không phải là một vấn đề.Kích thước tối đa khi phân tích cú pháp XML với DOM

Như fas như tôi hiểu có ba cách phân tích cú pháp XML với SDK Android:

  • SAX
  • XmlPullParser
  • DOM

Đọc về các phương pháp phân tích khác nhau tôi SAX được khuyến nghị cho các tệp XML lớn vì nó sẽ không giữ cây hoàn chỉnh trong bộ nhớ như DOM.

Tuy nhiên, tôi tự hỏi bản thân mình lớn về kilobyte, megabyte, ...? Có một kích thước thực tế mà nó không thực sự quan trọng cho dù sử dụng SAX hay DOM?

Cảm ơn,
Robert

+0

Thực tế để xử lý các tài liệu XML lớn, VTD-XML hiệu quả hơn và thân thiện với người dùng hơn SAX hoặc DOM ... –

+0

vtd hiệu quả, tôi nghĩ đó là giải pháp thay thế tốt – Zhar

Trả lời

9

Không có giới hạn tiêu chuẩn nào được đặt cho tài liệu XML hoặc kích thước DOM để nó phụ thuộc hoàn toàn vào những gì máy chủ có thể đối phó. Khi bạn đang triển khai trên Android, bạn nên giả định một lượng bộ nhớ khá hạn chế và nhớ DOM, trình phân tích cú pháp XML, logic chương trình của bạn, logic hiển thị, chính JVM và Android đều phải phù hợp với bộ nhớ có sẵn !

Theo quy tắc chung, bạn có thể mong đợi DOM chiếm bộ nhớ gấp bốn lần kích thước của tài liệu XML nguồn. Vì vậy, giả sử 512MB bộ nhớ có sẵn, nhằm mục đích để không có nhiều hơn một nửa số này cho bạn DOM và bạn kết thúc với 512/8 hoặc tối đa thực tế là 64MB cho tài liệu XML.

Chỉ để được ở bên an toàn, tôi sẽ một nửa mà một lần nữa đến tối đa 32MB. Vì vậy, nếu bạn mong đợi nhiều tài liệu có kích thước này, tôi sẽ chuyển sang phân tích SAX !.

Nếu bạn muốn ứng dụng phản hồi với bất kỳ tốc độ nào trên tài liệu lớn, SAX là cách để đi. Trình phân tích SAX có thể bắt đầu trả về kết quả ngay khi phần tử đầu tiên được đọc một trình phân tích cú pháp DOM cần đọc toàn bộ tài liệu trước khi bất kỳ đầu ra nào có thể được gửi đến chương trình của bạn.

+0

James, cảm ơn rất nhiều vì lời giải thích của bạn! Tôi hy vọng rằng tài liệu XML sẽ có kích thước tệp tối đa khoảng 30-50 kB, có thể xử lý được với DOM. Tuy nhiên, dường như việc triển khai trình phân tích cú pháp SAX sẽ là một giải pháp tổng thể tốt hơn. –

+0

VTD-XML có thể là một lựa chọn khác đáng xem xét, nếu hiệu suất và bộ nhớ là khía cạnh quan trọng của hiệu suất ứng dụng, việc sử dụng bộ nhớ của nó là khoảng 1/3 DOM trên hệ thống 32 bit, và nó hỗ trợ XPath –

4

Trích từ this article:

parsers DOM bị tiêu hao bởi. Với các bộ XML nhỏ hơn, đây không phải là vấn đề như vậy nhưng khi kích thước XML phát triển các trình phân tích cú pháp DOM trở nên ít hiệu quả hơn, làm cho chúng không thể mở rộng được về mặt phát triển XML của bạn. Trình phân tích cú pháp đẩy là phương tiện vui vì chúng cho phép bạn kiểm soát phân tích cú pháp, do đó loại bỏ bất kỳ loại quản lý trạng thái phức tạp nào kể từ khi trạng thái luôn được biết và chúng không bị lỗi bộ nhớ của trình phân tích cú pháp DOM.

Đây có thể là lý do SAX được đề xuất qua DOM: SAX hoạt động như một trình phân tích cú pháp đẩy XML. Ngoài ra, hãy xem bài viết trên Wikipedia về SAX here.

EDIT: Để giải quyết kích thước cụ thể, bạn sẽ phải xem xét triển khai của mình. Ví dụ về kích thước đối tượng DOM Document trong bộ nhớ của trình phân tích cú pháp XML dựa trên Java là here. Java, giống như nhiều ngôn ngữ, định nghĩa một số hạn chế dựa trên bộ nhớ như JVM heap size và các dịch vụ web của Android/XML DOM API cũng có thể xác định một số giới hạn nội bộ theo quyết định của người lập trình (được đề cập trong phần here). Không có một câu trả lời dứt khoát nào về kích thước tối đa cho phép.

+0

Có, tuy nhiên câu hỏi cốt lõi của tôi là tùy thuộc vào kích thước nào (kích thước tệp, số phần tử, v.v.) DOM có thể được sử dụng mà không phải lo lắng quá nhiều về chi phí bộ nhớ của nó? Như bài báo nói "Với các bộ XML nhỏ hơn, đây không phải là vấn đề [...]". Nhưng "nhỏ" nghĩa là gì? –

1

Kinh nghiệm của tôi cho phép tôi nói rằng việc sử dụng DOM bộ nhớ được sử dụng là 2x kích thước tệp, nhưng tất nhiên nó chỉ là một dấu hiệu. Nếu cây XML chỉ có một trường chứa toàn bộ dữ liệu, bộ nhớ được sử dụng tương tự như kích thước tệp!

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