2012-09-22 15 views
5

Descrizione: Ho un'enorme tabella di database MySQL. La dimensione totale è di circa 10 terabyte. Contiene solo testi.Un modo per ridurre la dimensione dei testi?

Un testo di esempio da questa tabella di database:

In altri casi, alcuni paesi hanno gradualmente imparato a produrre gli stessi prodotti e servizi che in precedenza solo gli Stati Uniti e pochi altri paesi potrebbero produrre. La crescita del reddito reale negli Stati Uniti è rallentata.

Ci sono circa 50 miliardi di testi diversi.

Cosa ho provato?

Ho provato a comprimere tutti. In realtà ha funzionato, ha ridotto le dimensioni totali. Tuttavia, ho bisogno di effettuare ricerche e non posso cercare alcun dato mentre si trovano in un file zip.

Ho provato la codifica di PHP base64. Ha fatto i miei dati di testo di esempio come:

SW4gb3RoZXIgY2FzZXMsIHNvbWUgY291bnRyaWVzIGhhdmUgZ3JhZHVhbGx5IGxlYXJuZW QgdG8gcHJvZHVjZSB0aGUgc2FtZSBwcm9kdWN0cyBhbmQgc2VydmljZXMgdGhhdCBwcmV2 aW91c2x5IG9ubHkgdGhlIFUuUy4gYW5kIGEgZmV3IG90aGVyIGNvdW50cmllcyBjb3VsZC Bwcm9kdWNlLiBSZWFsIGluY29tZSBncm93dGggaW4gdGhlIFUuUy4gaGFzIHNsb3dlZC4 =

Quello che mi piacerebbe realizzare?

Voglio ridurre le dimensioni del testo prima di inviarle a MySQL. Prima di tutto, non so come posso fare questo lavoro. Sto pensando di crittografare e decifrare i dati.

Così, qui è un esempio quello che voglio fare:

voglio crittografare i dati di testo prima di riporlo. Quindi, voglio chiamare i dati crittografati da MySQL per decodificare.

Un modo per ridurre la dimensione dei testi? Base64 non funziona per me, esiste un altro modo?

+0

Hai bisogno di ricerca full text? In tal caso non puoi comprimerli o MySQL non sarà in grado di eseguire la scansione dei testi. Ad ogni modo, incolla qui il contenuto del tuo database. – moonwave99

+2

Forse Lucene http://lucene.apache.org/ è quello che stai cercando. È fatto per la cosa che stai cercando di complice: cercare in grandi quantità di testo –

+0

Sì, ho bisogno di ricerca full-text. –

risposta

9

Nota: né base64encryption sono stati progettati per ridurre la lunghezza della stringa. Che cosa si dovrebbe guardare è la compressione e penso che si dovrebbe guardare gzcompress e gzdeflate

Esempio utilizzando la versione decodificata del testo

$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; 

uscita

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

Sì, funziona :) Ho provato sul mio localhost. Compagno di aiuto perfetto !!!! Grazie mille. È quello che voglio. E inoltre, Dirk mi suggerì Apache Lucene.Userò entrambi. –

+0

Cool .. felice di essere stato in grado di aiutare – Baba

3

Base64 non è la compressione o la crittografia , è la codifica. Puoi passare i dati di testo tramite l'algoritmo di compressione gzip (http://php.net/manual/en/function.gzcompress.php) prima di memorizzarlo nel database, ma in pratica renderà i dati non ricercabili tramite query MySQL.

1

Mentre entrambe le risposte risolvono la domanda e forniscono opzioni per la compressione del testo, penso che la compressione aiuterà a risolvere il problema. La ricerca di grandi quantità di dati non è mai stata l'obiettivo di database relazionali come MySQL.

Hai un ottimo suggerimento per Apache Lucene e ci sono altre opzioni come Sphinxsearch. Ecco un filo rapido sul confronto:

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

+0

Grazie amico, ho intenzione di controllare Sphinxsearch. Sono sicuro che mi aiuterà. Grazie, perché non ho mai conosciuto Sphinxsearch prima. –

2

Va bene, è davvero impegnativo! (almeno per me!) ... hai 10 TB di testo e vuoi caricarlo sul tuo database MySQL ed eseguire una ricerca a testo completo sui tavoli!

Forse un po 'di cluster o alcune prestazioni complicate su un buon hardware funzionano per voi, ma se non è così, potreste trovarlo interessante.

In primo luogo, è necessario uno script per caricare questi 50 miliardi di testo uno dopo l'altro, dividerli in alcuni words e trattarli come una parola chiave, ciò significa assegnare loro un ID numerico e quindi salvarli su un tavolo . dal modo in cui I am piece of large text. sarebbe qualcosa di simile:

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

e I'm the next large part! sarebbe:

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

dalle parole modo I, am, of, I'm, the più ., ! è stata eliminata perché non fanno nulla di solito in una ricerca keyword-based. Comunque puoi tenerli anche nel tuo array di parole chiave, se lo desideri.

Assegna un testo univoco al testo originale. È possibile calcolare il md5 del testo originale o semplicemente dando un ID numerico. Conservare questo id da qualche parte.

È necessario disporre di una tabella per mantenere le relazioni tra texts e keywords. sarebbe una struttura many-to-many come questo:

[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 

Ora, immaginate quanto sarebbe più facile (soprattutto per MySQL!) se la ricerca di qualcuno large text!

Per quanto ho trovato 'sulla rete, sarebbe circa 50,000 o 60,000 di parole come parole chiave o al massimo 600,000 - 700,000 parole, se solo tenere tutto come parola chiave. Quindi, puoi semplicemente supporre che 50.000 parole sarebbero molto meno di 10 TB di dati basati su testo.

Spero che sia d'aiuto, e se ne hai bisogno posso spiegarti di più o aiutarti a farlo funzionare in qualche modo! :)

+0

Wow, fantastico !! Ho davvero amato la tua strada. Potete darci maggiori informazioni? A proposito, ho già copiato e incollato il tuo messaggio sul mio computer nel caso qualcuno lo cancelli. Risposta perfetta, grazie, ma ho bisogno di testarlo sul mio localhost. Ci vorrà del tempo per testare tutto. –

+0

grazie! fammi solo sapere quali parti non sono abbastanza chiare ... in generale direi di testarlo prima con poche frasi, e poi iniziare a caricare i tuoi dati in questo, ma lentamente. Se vedi che funziona correttamente, diciamo 200 MB di testo, quindi puoi scrivere un'applicazione c, java, perl per analizzare il tuo testo e metterlo sul tuo database. dal lato PHP, devi solo eseguire la fase finale della ricerca, che proviene dall'utente finale. – Mahdi

+0

Questa sarebbe un'ottima risposta per me se mi forniste informazioni con un campione. Ho intenzione di memorizzare informazioni di testo di 10 TB comunque? Non sono riuscito a capire la tua offerta in modo esagerato, tuttavia i tuoi suoni sono molto interessanti e vale la pena perseguire. –

Problemi correlati