2012-09-22 8 views
5

Beschreibung: Ich habe eine große MySQL-Datenbank-Tabelle. Die Gesamtgröße beträgt etwa 10 Terabyte. Es enthält nur Texte.Wie kann man die Größe von Texten reduzieren?

Ein Beispieltext aus dieser Datenbanktabelle:

In anderen Fällen haben einige Länder allmählich gelernt, die die gleichen Produkte und Dienstleistungen zu produzieren, die bisher nur die USA und einige andere Länder produzieren könnten. Das reale Einkommenswachstum in den USA hat sich verlangsamt.

Es gibt etwa 50 Milliarden verschiedene Texte.

Was habe ich versucht?

Ich habe versucht, sie alle zu zippen. Eigentlich hat es geklappt, die Gesamtgröße reduziert. Ich muss jedoch suchen und ich kann keine Daten suchen, während sie sich in einer Zip-Datei befinden.

Ich habe PHP base64 Codierung versucht.

SW4gb3RoZXIgY2FzZXMsIHNvbWUgY291bnRyaWVzIGhhdmUgZ3JhZHVhbGx5IGxlYXJuZW QgdG8gcHJvZHVjZSB0aGUgc2FtZSBwcm9kdWN0cyBhbmQgc2VydmljZXMgdGhhdCBwcmV2 aW91c2x5IG9ubHkgdGhlIFUuUy4gYW5kIGEgZmV3IG90aGVyIGNvdW50cmllcyBjb3VsZC Bwcm9kdWNlLiBSZWFsIGluY29tZSBncm93dGggaW4gdGhlIFUuUy4gaGFzIHNsb3dlZC4 =

Was ich möchte, erreichen: Es ist meine Probe Textdaten wie gemacht?

Ich möchte die Textgröße reduzieren, bevor ich sie an MySQL sende. Zu allererst weiß ich nicht, wie ich diesen Job machen kann. Ich denke daran, die Daten zu verschlüsseln und zu entschlüsseln. So

, hier ist ein Beispiel, was ich tun möchte:

Ich möchte Textdaten verschlüsseln, bevor zu speichern. Dann möchte ich verschlüsselte Daten von MySQL aufrufen, um sie zu entschlüsseln.

Wie kann man die Größe von Texten reduzieren? Base64 funktioniert nicht für mich, gibt es einen anderen Weg?

+0

Brauchen Sie eine Volltextsuche? In diesem Fall können Sie nicht komprimieren oder Sie können MySQL nicht crawlen. Wie auch immer, fügen Sie hier Ihren Datenbankinhalt ein. – moonwave99

+2

Vielleicht Lucene http://lucene.apache.org/ ist, was Sie suchen. Es ist gemacht für die Sache, die du versuchst zu Komplizen: Suche in großen Mengen von Text –

+0

Ja, ich brauche eine Volltextsuche. –

Antwort

9

Bitte beachten Sie, dass weder base64 noch encryption zur Reduzierung der String-Länge entwickelt wurde. Was sollten Sie bei suchen ist Kompression und ich denke, Sie bei gzcompress und gzdeflate

Beispiel für die Verwendung decodiert Version des Textes

$original = "In other cases, some countries have gradually learned to produce the same products and services that previously only the U.S. and a few other countries could produce. Real income growth in the U.S. has slowed." ; 
$base64 = base64_encode($original); 
$compressed = base64_encode(gzcompress($original, 9)); 
$deflate = base64_encode(gzdeflate($original, 9)); 
$encode = base64_encode(gzencode($original, 9)); 


$base64Length = strlen($base64); 
$compressedLength = strlen($compressed) ; 
$deflateLength = strlen($deflate) ; 
$encodeLength = strlen($encode) ; 

echo "<pre>"; 
echo "Using GZ Compress = " , 100 - number_format(($compressedLength/$base64Length) * 100 , 2) , "% of Improvement", PHP_EOL; 
echo "Using Deflate  = " , 100 - number_format(($deflateLength/$base64Length) * 100 , 2) , "% of Improvement", PHP_EOL; 

Ausgabe

Using GZ Compress = 32.86% Improvement 
Using Deflate  = 35.71% Improvement 
+0

Ja, es funktioniert :) Ich habe auf meinem localhost versucht. Perfekte Hilfe mate !!!! Vielen Dank. Das ist, was ich will. Und auch Dirk hat mir Apache Lucene vorgeschlagen.Ich werde beide benutzen. –

+0

Cool .. froh, ich konnte helfen – Baba

3

Base64 nicht Komprimierung oder Verschlüsselung aussehen sollte Es ist Kodierung. Sie können Textdaten über den gzip-Komprimierungsalgorithmus (http://php.net/manual/en/function.gzcompress.php) weitergeben, bevor Sie sie in der Datenbank speichern. Dadurch werden die Daten jedoch im Grunde genommen über MySQL-Abfragen unerforschbar.

1

Während beide Antworten die Frage beantworten und Optionen für die Textkomprimierung bieten, denke ich, dass die Komprimierung zur Lösung Ihres Problems beitragen wird. Das Durchsuchen großer Datenmengen war nie der Zweck relationaler Datenbanken wie MySQL.

Sie haben einen sehr guten Tipp für Apache Lucene, und es gibt andere Optionen wie Sphinxsearch. Hier ist ein kurzer Thread auf einem Vergleich:

Comparison of full text search engine - Lucene, Sphinx, Postgresql, MySQL?

+0

Danke Kumpel, ich werde Sphinxsearch überprüfen. Ich bin sicher, dass es mir helfen wird. Danke, weil ich Sphinxsearch noch nicht kannte. –

2

Okay, es ist wirklich schwierig! (zumindest für mich!) ... Sie haben 10 TB Text und möchten es in Ihre MySQL-Datenbank laden und eine Volltextsuche an den Tabellen durchführen!

Vielleicht funktioniert einige Clustering oder einige Performance-Tricks auf einer guten Hardware für Sie, aber wenn das nicht der Fall ist, könnten Sie es interessant finden.

Zuerst brauchen Sie ein Skript, um diese 50 Milliarden Textstücke nacheinander zu laden, sie in einige words zu teilen und sie als Schlüsselwort zu behandeln, dh ihnen eine numerische ID zu geben und sie dann in einer Tabelle zu speichern . durch die Art und Weise I am piece of large text. würde wie folgt sein:

[1: piece][2: large][3: text] 

und I'm the next large part! wäre:

[4: next][2: large][5: part] 

Durch die Art und Weise Worte I, am, of, I'm, the Plus ., ! eliminiert worden, weil sie in der Regel in einer keyword-based Suche nicht nichts tun. Sie können sie jedoch auch in Ihrem Keyword-Array speichern, wenn Sie möchten.

Geben Sie dem Originaltext eine eindeutige ID. Sie können die md5 des ursprünglichen Textes berechnen oder einfach nur eine numerische ID geben. Speichern Sie diese id irgendwo dann.

Sie müssen eine Tabelle haben, um die Beziehungen zwischen texts und keywords zu halten. es wäre eine many-to-many Struktur wie folgt sein:

[text_id][text] 
1 -> I am piece of large text. 
2 -> I'm the next large part! 

[keyword_id][keyword] 
1 -> piece 
2 -> large 
3 -> text 
4 -> next 
5 -> part 

[keyword_id][text_id] 
1 -> 1 
2 -> 1 
3 -> 1 
4 -> 2 
2 -> 2 
5 -> 2 

nun vorstellen, wie viel es (vor allem für MySQL!) einfacher, wenn jemand Suche large text! 700,000 Worten, wenn Sie nur alles als Schlüsselwort halten -

Soweit ich auf dem ‚Netz gefunden, wäre es etwa 50,000 oder 60,000 von Wörtern wie Ihre Keywords oder maximal 600,000 sein. So können Sie einfach schätzen, 50.000 Wörter wären weit weniger als 10 TB von textbasierten Daten.

Ich hoffe, dass es hilft, und wenn Sie brauchen, kann ich mehr erklären oder Ihnen helfen, das irgendwie funktioniert zu machen! :)

+0

Wow, erstaunlich !! Ich habe dich wirklich sehr geliebt. Können Sie uns bitte mehr Informationen geben? Übrigens, ich habe Ihre Nachricht bereits kopiert und auf meinen Computer kopiert, falls jemand sie löscht. Perfekte Antwort, danke, aber ich muss es auf meinem localhost testen. Es wird einige Zeit dauern, alles zu testen. –

+0

danke! lassen Sie mich einfach wissen, welche Teile nicht genug klar sind ... im Allgemeinen würde ich sagen, zuerst testen Sie es auf ein paar Sätze, und dann beginnen Sie Ihre Daten in das laden, aber langsam. Wenn Sie sehen, dass es richtig funktioniert, sagen wir 200 MB Text, dann können Sie eine c, java, perl-Anwendung schreiben, um Ihren Text einfach zu parsen und in Ihre Datenbank zu schreiben. Auf PHP-Seite müssen Sie nur die letzte Phase der Suche durchführen, die vom Endbenutzer kommt. – Mahdi

+0

Das wäre eine gute Antwort für mich, wenn Sie mir Informationen mit einer Probe geben würden. Soll ich trotzdem 10 TB Textinfo speichern? Ich konnte Ihr Angebot nicht genau verstehen, aber Ihre Klänge sind sehr interessant und es lohnt sich, sie zu verfolgen. –

Verwandte Themen