2009-07-04 9 views
26

Ich weiß kaum etwas über Kompression, also ertragen Sie mit mir (das ist wahrscheinlich eine dumme und schmerzhaft offensichtliche Frage).Der beste Komprimierungsalgorithmus für XML?

Also sagen wir, ich habe eine XML-Datei mit ein paar Tags.

Jetzt sagen wir, ich habe eine Reihe dieser sehr langen Tags mit vielen Attributen in meinen mehreren XML-Dateien. Ich muss sie auf die kleinste mögliche Größe komprimieren. Der beste Weg wäre, einen XML-spezifischen Algorithmus zu verwenden, der einzelnen Tags Pseudonyme wie vlt1 oder vlt2 zuweist. Dies wäre jedoch nicht so "offen", wie ich es versuche, und ich möchte einen gemeinsamen Algorithmus wie DEFLATE oder LZ verwenden. Es hilft auch, wenn das Archiv eine ZIP-Datei war.

Da es sich um Klartext handelt (keine binären Dateien wie Bilder), möchte ich einen Algorithmus, der zu reinem Text passt. Welcher erzeugt die kleinste Dateigröße (verlustfreie Algorithmen werden bevorzugt)?

Übrigens ist das Szenario: Ich erstelle einen Standard für Dokumente, wie ODF oder MS Office XML, die XML-Dateien enthalten, verpackt in einer .zip.

EDIT: Die 'Verschlüsselung' Sache war ein Tippfehler; Es sollte "Kompression" haben.

+4

Wie hängt das mit der Verschlüsselung zusammen? Und die einfache Antwort ist, dass ZIP die Komprimierung durchführt: es ist weit verbreitet, hat einen guten Job für Text und es ist nicht die Zeit wert, "die kleinste mögliche Größe" zu finden. – kdgregory

+0

Warum nicht einfach OpenXML verwenden? Es ist im Grunde, was du willst :). Nicht sicher, ob es die beste Komprimierung ist, aber ich mag es bisher. Und wenn Sie es nicht bereits wissen, ist OpenXML im Grunde eine Zip-Datei, so dass Sie Ihre Office 2007-Dokumente als ZIP-Datei (z. B. something.docx in something.zip) umbenennen und als Zip-Datei öffnen können. Inside ist im Grunde eine Menge XMLs. –

+0

Sie könnten einfach eine Reihe von XML-Dateien in einer Zip-Datei und jeder gewünschten Dateierweiterung verwenden.Warum die sehr langen Nummern ??? –

Antwort

29

Es gibt einen W3-Standard (noch nicht veröffentlicht) EXI (Efficient XML Interchange).

Sollte in Zukunft DAS Datenformat für die Komprimierung von XML-Daten werden (angeblich das letzte notwendige Binärformat). Da es für XML optimiert ist, komprimiert es XML effizienter als jeder herkömmliche Komprimierungsalgorithmus.

Mit EXI können Sie komprimierte XML-Daten im laufenden Betrieb bearbeiten (ohne sie dekomprimieren oder neu komprimieren zu müssen).

EXI = (XML + XMLSchema) als Binärdatei.

Und hier gibt es mit der Open-Source-Implementierung gehen (weiß nicht, ob es schon stabil ist):
Exificient

+4

Ugh .. XML wurde entwickelt, weil "Binärdateien böse sind". Und wir haben jetzt diese EXI-Sachen. Dieser Beweis XML erfand nur das Rad neu. Hätten wir nicht ASN.1 verwenden sollen? –

+6

Einige Substandard (oder etwas) von ASN.1 war ein Kandidat für EXI. Binärdateien ** sind ** böse. EXI ist keine binäre Datei im üblichen Sinne. Sie müssen keine eigene Implementierung schreiben, um diese Binärdatei zu lesen/schreiben, noch müssen Sie eine eigene Struktur definieren und das System eingeben. Alles getan für Sie von XML + XmlSchema. –

+3

Seit 2011-03-10 ist EXI jetzt eine W3C-Empfehlung: http://www.w3.org/TR/exi/ –

2

Es scheint, als ob Sie eher an Komprimierung als an Verschlüsselung interessiert sind. Ist das der Fall? Wenn dies der Fall ist, könnte this eine interessante Lektüre sein, obwohl es keine exakte Lösung ist.

0

Ich hoffe, dass ich das richtig verstanden, was Sie tun müssen, um ... Das erste, was ich sagen möchte ist, dass es keine gute oder schlechte Kompression algorithmss für Text - zip, bzip, gzip, rar, 7zip sind gut genug, um alles zu komprimieren, das einen niedrigen entrpy hat - dh große Datei mit kleinem Zeichensatz. Wenn ich sie benutzen müsste würde ich 7zip bei meiner ersten Wahl wählen, rar als eine Sekunde und zip als dritte. Aber der Unterschied ist sehr klein, also sollten Sie versuchen was auch immer einfacher für Sie. Zweitens - ich konnte nicht verstehen, was Sie verschlüsseln wollen. Nehmen wir an, dass dies eine XML-Datei ist, dann sollten Sie sie zunächst mit Ihrem bevorzugten Komprimierungsalgorithmus komprimieren und dann mit Ihrem bevorzugten Verschlüsselungsalgorithmus verschlüsseln. In den meisten Fällen ist jeder moderne Algorithmus, der zum Beispiel in PGP implementiert ist, für alles sicher genug. Hoffe, dass hilft.

+0

Eine Unterschrift in einer Antwort! Das ist neu;) –

0

Ihre Alternativen sind:

  • einen Webserver verwenden, die gzip-Komprimierung unterstützt. Es komprimiert automatisch alle ausgehenden HTML. Es gibt jedoch eine kleine CPU-Strafe.
  • Verwenden Sie so etwas wie JSON. Es wird die Größe der Nachricht drastisch reduzieren
  • Es gibt auch eine binäre XML, aber ich habe es selbst nicht versucht.
+0

JSON ist wirklich nicht kleiner als xml obwohl –

1

By the way, ist das Szenario dies: Ich habe einen Standard für Dokumente erschaffe, wie ODF oder MS Office XML, die XML-Dateien enthalten, in einer ZIP-verpackt.

dann würde ich vorschlagen, Sie verwenden. ZIP-Komprimierung, oder Ihre Benutzer werden verwirrt.

+0

Ja, plus komprimieren komprimieren XML wird keine weitere Komprimierung ergeben. –

4

Eine weitere Alternative zu "komprimieren" XML würde FI (Fast Infoset) sein.

XML, wie FI gespeichert, würde jeden Tag enthalten und Attribut nur einmal, alle anderen Vorkommen die erste verweisen, platzsparend.

See:

Very good article on java.sun.com und natürlich
the Wikipedia entry

Der Unterschied zur Kompression Sicht Exi ist, dass Fast-Infoset (strukturierten Klartext ist) weniger effizient ist.

Anderer wichtiger Unterschied ist: FI ist ein ausgereifter Standard mit vielen Implementierungen.
Einer davon: Fast Infoset Project @ dev.java.net

+0

Wir sollten wahrscheinlich erwähnen, dass der Grund, warum EXI sich gegen FI durchgesetzt hat, darin besteht, dass, wenn es ein Schema gibt, Es kann Tags und Attribute NULL statt einmal enthalten. –

4

Ja, * .zip in der Praxis am besten. Gory deets enthalten in this USENIX paper, die zeigen, dass "optimale" Kompressoren keine rechnerischen Kosten wert sind & Domain-spezifische Kompressoren schlagen nicht im Durchschnitt [zip].

Haftungsausschluss: Ich habe dieses Papier geschrieben, das laut Google mehr als 60 Mal zitiert wurde.

0

Keine der Standardeinstellungen ist ideal für XML, aber Sie erhalten immer noch gute Werte, da viele Wiederholungen vorhanden sind.

Da XML viele Wiederholungen (Tags.>) Verwendet, möchten Sie, dass diese weniger als ein Bit sind, also etwas arithmetisches statt Huffman-Codierung. Daher sollte rar/7zip in der Theorie deutlich besser sein. Diese Algorithmen bieten eine hohe Komprimierung, sind also langsamer. Idealerweise möchten Sie eine einfache Komprimierung mit einem arithmetischen Encoder (was für XML wäre schnell und geben hohe Komprimierung).