Datenbank mit feldübergreifender Text-Komprimierung

Tom.S

Fleissiger Benutzer
Beiträge
62
Hallo Forum,
ich möchte eine riesige Sammlung deutschsprachiger Texte in eine Datenbank spielen. Diese zehn oder mehr Terrabyte sollen in einzelne Sätze getrennt eingefügt werden. Ich brauche dafür keinen Volltextindex oder eine andere Suchmöglichkeit: Datensätze werden in der Regel komplett ausgelesen.
Diese Daten eignen sich hervorragend für eine feldübergreifende Komprimierung. Die Idee geht so: Ich lade 10 GB an Text in die DB und starte eine Komprimierung: Die DB-Engine lernt die Struktur der Daten und komprimiert sie, wie auch alle folgenden Einträge, solange ich nicht die Komprimierung neu starte bzw. die DB nicht von selbst die Komprimierung erneut anstößt.
Für mich ist die feldübergreifende Komprimierung wichtig: Dass also nicht ein einzelnes Feld für sich komprimiert wird, sondern die Komprimierung aus der Spalte insgesamt gelernt wird, weil es sonst einen zu großen Overhead gibt, wenn das feldweise passiert. Deshalb funktioniert z. B. Toast bei PostgrSQL nicht wie ich mir das vorstelle (zumindest, wenn ich das richtig verstanden habe.).
Ich sehe jetzt zwei Lösungen:
* Es gibt ein (freies) DB-System, das diese Funktionalität mitbringt oder
* ich komprimiere die Daten extern und füge sie als Binary Objects ein. (Wie es z. B. die Wikipedia macht.)

Bei letzterer Lösung würde mich interessieren, ob es die Möglichkeit gibt, an eine Spalte eine compress-Funktion zu binden. Sprich alle Zugriffe auf diese Spalte werden automatisch verarbeitet, also komprimiert bzw. dekomprimiert, ohne dass ich dies in dem zugreifenden Programm realisieren müsste. Das Problem wäre hier wieder die feldübergreifende Komprimierung.

Ich freue mich auf Eure Antworten.
 
Werbung:
@akretschmer: Mist, da habe ich mich sehr missverständlich ausgedrückt: Ich meine nicht felderübergreifend, sondern zellenübergreifend. Ich habe eine einzige Spalte Text, in der es Datensätze (Zellen) im sieben- oder achtstelligen Bereich gibt:


Textspalte |
Die ist die erste Spalte.
Lorem ipsum lorem ipsum.
....
Dies ist die 30-millionste Zelle und auch die letzte, die es zu komprimieren gilt.


Jetzt möchte ich diese Datenzellen komprimieren, aber nicht so, dass die Komprimierungsfunktion jede Zelle neu analysiert und deshalb auch die Abbildungstabelle für jede Zelle neu speichern muss. Denn da der Text in jeder Zelle so gering wie oben ist, würde das den Kompressionseffekt zunichte machen. Ich möchte, dass die Abbildungstabelle, die Token auf die ursprünglichen Zeichen abbildet einmal für alle Zellen gebildet wird und die Abbildungstabelle auch nur einmal gespeichert wird.

@Walter: Die Tabelle wird immer komplett ausgelesen und verarbeitet, ich benötige deshalb keinen Zugriff auf einzelne Datensätze, keine Volltextsuche und entsprechend auch keinen Index.
 
@akretschmer: Mist, da habe ich mich sehr missverständlich ausgedrückt: Ich meine nicht felderübergreifend, sondern zellenübergreifend. Ich habe eine einzige Spalte Text, in der es Datensätze (Zellen) im sieben- oder achtstelligen Bereich gibt:

Vielleicht ist das was für Dich: http://www.citusdata.com/blog/76-postgresql-columnar-store-for-analytics

Ich geb aber 2 Dinge zu:

  • Dein Problem nicht ganz verstanden zu haben
  • ich hab damit keinerlei Erfahrung

30 Millionen Zeilen ist jetzt nichts, was mich irgendwie beeindrucken würde.
 
Werbung:
Die Frage die ich mir stelle ist:
Lohnt sich die Komprimierung überhaupt ?
Die Dauer der Dekompression wenn die Tabelle IMMER komplett ausgelesen wird... Will ich nur ungern miterleben ^^
 
Zurück
Oben