2009-07-04 42 views
26

Tôi hầu như không biết gì về nén, vì vậy hãy chịu đựng tôi (đây có lẽ là một câu hỏi ngu ngốc và cực kỳ rõ ràng).Thuật toán nén tốt nhất cho XML?

Vì vậy, cho phép nói rằng tôi có một tệp XML với một vài thẻ.

<verylongtagnumberone> 
    <verylongtagnumbertwo> 
    text 
    </verylongtagnumbertwo> 
</verylongtagnumberone> 

Bây giờ, giả sử tôi có một loạt các thẻ rất dài này với nhiều thuộc tính trong nhiều tệp XML của tôi. Tôi cần phải nén chúng vào kích thước nhỏ nhất có thể. Cách tốt nhất là sử dụng thuật toán XML cụ thể, chỉ định các thẻ riêng lẻ như vlt1 hoặc vlt2. Tuy nhiên, điều này sẽ không được 'mở' một cách như tôi đang cố gắng để đi, và tôi muốn sử dụng một thuật toán phổ biến như DEFLATE hoặc LZ. Nó cũng giúp đỡ nếu lưu trữ là một tệp .zip.

Vì tôi đang xử lý văn bản thuần túy (không có tệp nhị phân như hình ảnh), tôi muốn một thuật toán phù hợp với văn bản thuần túy. Mà một trong những sản xuất kích thước tập tin nhỏ nhất (thuật toán lossless được ưa thích)?

Nhân tiện, kịch bản là: Tôi đang tạo một tiêu chuẩn cho các tài liệu, như ODF hoặc MS Office XML, có chứa các tệp XML, được đóng gói trong tệp .zip.

EDIT: Điều 'mã hóa' là lỗi chính tả; nó nên ave ben 'nén'.

+4

Điều này liên quan đến mã hóa như thế nào? Và câu trả lời đơn giản là để cho ZIP thực hiện nén: nó có sẵn rộng rãi, thực hiện một công việc phong nha về văn bản và không đáng để tìm "kích thước nhỏ nhất có thể". – kdgregory

+0

Tại sao không chỉ sử dụng OpenXML? Đó là cơ bản những gì bạn muốn :). Không chắc đó có phải là nén tốt nhất hay không, nhưng tôi thích nó cho đến nay. Và nếu bạn chưa biết, OpenXML cơ bản là một tệp nén, vì vậy bạn có thể đổi tên các tài liệu Office 2007 của bạn dưới dạng tệp .zip (ví dụ: something.docx thành something.zip) và mở nó dưới dạng tệp nén. Bên trong về cơ bản là bó XML. –

+0

Bạn có thể chỉ cần sử dụng một loạt các tệp XML trong một tệp zip và bất kỳ phần mở rộng tệp nào bạn muốn.Tại sao các verylongtagnumbers ??? –

Trả lời

29

Có tiêu chuẩn W3 (chưa được phát hành) có tên EXI (Efficient XML Interchange).

Nên trở thành định dạng dữ liệu để nén dữ liệu XML trong tương lai (được xác định là định dạng nhị phân cần thiết cuối cùng). Được tối ưu hóa cho XML, nó nén XML theo nhiều cách hiệu quả hơn bất kỳ thuật toán nén thông thường nào.

Với EXI, bạn có thể hoạt động trên dữ liệu XML đã nén khi đang di chuyển (mà không cần phải giải nén hoặc nén lại).

EXI = (XML + XMLSchema) dưới dạng nhị phân.

Và ở đây bạn đi với việc thực hiện mã nguồn mở (không biết nếu nó đã ổn định):
Exificient

+4

Ugh .. XML được thiết kế vì "tệp nhị phân là dữ liệu xấu". Và bây giờ chúng ta có những thứ EXI này. Bằng chứng XML này chỉ là phát minh lại bánh xe. Chúng ta có nên sử dụng ASN.1 không? –

+6

Một số tiêu chuẩn (hoặc cái gì đó) của ASN.1 là một ứng cử viên cho EXI. Tệp nhị phân ** là ** tà ác. EXI không phải là một tệp nhị phân theo nghĩa thông thường. Bạn không cần phải viết thực hiện riêng để đọc/ghi tệp nhị phân này, cũng như bạn không phải xác định cấu trúc và kiểu hệ thống riêng. Tất cả được thực hiện cho bạn bởi XML + XmlSchema. –

+3

Từ 2011-03-10, EXI bây giờ là Khuyến nghị của W3C: http://www.w3.org/TR/exi/ –

2

Dường như bạn quan tâm đến việc nén hơn là mã hóa. Đó là trường hợp? Nếu vậy, this có thể chứng minh một điều thú vị mặc dù không phải là giải pháp chính xác.

0

Tôi hy vọng tôi hiểu chính xác những gì bạn cần làm ... Điều đầu tiên tôi muốn nói là không có nén tốt hay xấu thuật toán cho văn bản - zip, bzip, gzip, rar, 7zip là tốt đủ để nén mọi thứ có entrpy thấp - nghĩa là tệp lớn có bộ ký tự nhỏ. Nếu tôi sẽ phải sử dụng chúng tôi sẽ chọn 7zip tại lựa chọn đầu tiên của tôi, rar là giây và zip là thứ ba. Nhưng sự khác biệt là rất nhỏ vì vậy bạn nên thử bất cứ điều gì dễ dàng hơn cho bạn. Thứ hai - Tôi không thể hiểu những gì bạn đang cố gắng mã hóa. Giả sử rằng đây là tệp XML thì trước tiên bạn nên nén nó bằng thuật toán nén yêu thích và sau đó mã hóa thuật toán bằng thuật toán mã hóa yêu thích của bạn . Trong hầu hết các trường hợp, bất kỳ thuật toán hiện đại nào được triển khai ví dụ trong PGP sẽ đủ an toàn cho mọi thứ. Hy vọng điều đó sẽ hữu ích.

+0

Chữ ký trong câu trả lời! Đó là mới;) –

0

lựa chọn thay thế của bạn là:

  • Sử dụng một máy chủ web có hỗ trợ nén gzip. Nó sẽ tự động nén tất cả html gửi đi. Có một hình phạt CPU nhỏ mặc dù.
  • Sử dụng một cái gì đó như JSON. Nó sẽ làm giảm đáng kể kích thước của thông báo
  • Ngoài ra còn có một XML nhị phân nhưng tôi đã không tự mình thử nó.
+0

JSON thực sự không phải là bất kỳ nhỏ hơn xml mặc dù –

1

Bằng cách này, kịch bản là thế này: Tôi đang tạo ra một tiêu chuẩn cho các tài liệu, như ODF hoặc MS Office XML, có chứa các file XML, đóng gói trong một .zip.

thì tôi khuyên bạn nên sử dụng nén .zip hoặc người dùng của bạn sẽ bị nhầm lẫn.

+0

Có, cộng với nén nén XML sẽ không mang lại thêm bất kỳ nén nào. –

4

Một lựa chọn khác để "nén" XML sẽ FI (Fast Infoset).

XML, được lưu trữ như FI, sẽ chứa tất cả các thẻ và thuộc tính chỉ lần, tất cả các sự cố khác đang tham chiếu đầu tiên, do đó tiết kiệm không gian.

Xem:

Very good article on java.sun.com, và tất nhiên
the Wikipedia entry

Sự khác biệt để EXI từ quan điểm của nén xem là nhanh Infoset (là rõ cấu trúc) là kém hiệu quả.

Sự khác biệt quan trọng khác là: FI là tiêu chuẩn trưởng thành với nhiều triển khai.
Một trong số họ: Fast Infoset Project @ dev.java.net

+0

Có lẽ chúng ta nên đề cập rằng lý do EXI thắng trên FI là, khi có một lược đồ, nó có thể chứa thẻ và thuộc tính ZERO lần thay vì một lần. –

4

Có, * .zip tốt nhất trong thực tế. Gory deets chứa trong this USENIX paper cho thấy rằng máy nén "tối ưu" không đáng giá chi phí tính toán & máy nén dành riêng cho miền không đánh bại zip [trung bình].

Tuyên bố từ chối trách nhiệm: Tôi đã viết bài báo đó, đã được trích dẫn 60 lần theo Google.

0

Không có cái nào trong số những cái mặc định là lý tưởng cho XML nhưng bạn vẫn sẽ nhận được các giá trị tốt vì có rất nhiều lần lặp lại.

Bởi vì XML sử dụng nhiều lần lặp lại (thẻ.>) Bạn muốn chúng nhỏ hơn một chút nên một số dạng số học thay vì mã hóa Huffman. Vì vậy, rar/7zip nên được tốt hơn đáng kể trong lý thuyết .. các thuật toán này cung cấp nén cao nên chậm hơn. Lý tưởng nhất là bạn muốn có một nén đơn giản với một bộ mã hóa số học (mà cho XML sẽ được nhanh chóng và cung cấp cho nén cao).

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