2012-09-22 23 views
5

Descripción: Tengo una enorme tabla de base de datos MySQL. El tamaño total es de aproximadamente 10 terabytes. Solo contiene textos¿Alguna manera de reducir el tamaño de los textos?

Un texto de ejemplo de esta tabla de base de datos:

En otros casos, algunos países han aprendido gradualmente a producir los mismos productos y servicios que antes sólo los EE.UU. y algunos otros países podrían producir. El crecimiento del ingreso real en los EE. UU. Se ha desacelerado.

Hay alrededor de 50 mil millones de textos diferentes.

¿Qué he probado?

He intentado comprimirlos todos. En realidad, ha funcionado, redujo el tamaño total. Sin embargo, necesito hacer búsquedas y no puedo buscar datos mientras están ubicados en un archivo zip.

He intentado con la codificación base64 de PHP. Ha hecho que mis datos de texto de ejemplo como:

SW4gb3RoZXIgY2FzZXMsIHNvbWUgY291bnRyaWVzIGhhdmUgZ3JhZHVhbGx5IGxlYXJuZW QgdG8gcHJvZHVjZSB0aGUgc2FtZSBwcm9kdWN0cyBhbmQgc2VydmljZXMgdGhhdCBwcmV2 aW91c2x5IG9ubHkgdGhlIFUuUy4gYW5kIGEgZmV3IG90aGVyIGNvdW50cmllcyBjb3VsZC Bwcm9kdWNlLiBSZWFsIGluY29tZSBncm93dGggaW4gdGhlIFUuUy4gaGFzIHNsb3dlZC4 =

Lo que me gustaría lograr?

Quiero reducir el tamaño del texto antes de enviarlo a MySQL. Antes que nada, no sé cómo puedo hacer este trabajo. Estoy pensando en encriptar y descifrar los datos.

lo tanto, aquí es un ejemplo de lo que quiero hacer:

quiero para cifrar los datos de texto antes de guardar. Luego, quiero llamar a los datos cifrados de MySQL para descifrarlos.

¿Alguna manera de reducir el tamaño de los textos? Base64 no funciona para mí, ¿hay alguna otra manera?

+0

¿Necesita hacer búsqueda de texto completo? En ese caso, no puede comprimir o MySQL no podrá rastrear textos. De todos modos, pegue el contenido de su base de datos aquí. – moonwave99

+2

Tal vez Lucene http://lucene.apache.org/ es lo que estás buscando. Está hecho para lo que intentas hacer: buscar en grandes cantidades de texto –

+0

Sí, necesito una búsqueda de texto completo. –

Respuesta

9

Tenga en cuenta que ni base64 ni encryption se diseñaron para reducir la longitud de la cuerda. Lo que usted debe mirar es la compresión y creo que usted debe buscar en gzcompress y gzdeflate

Ejemplo utilizando la versión decodificada de su texto

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

salida

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

Sí, funciona :) Lo he probado en mi servidor local. Ayuda perfecta compañero !!!! Muchas gracias. Eso es lo que quiero. Y también, Dirk me sugirió Apache Lucene.Los usaré a los dos. –

+0

Genial ... me alegro de haber podido ayudar – Baba

3

base 64 no es la compresión o el cifrado , es codificación. Puede pasar datos de texto a través del algoritmo de compresión gzip (http://php.net/manual/en/function.gzcompress.php) antes de almacenarlos en la base de datos, pero eso básicamente hará que los datos sean imposibles de buscar a través de consultas MySQL.

1

Si bien ambas respuestas abordan la pregunta y proporcionan opciones para la compresión de texto, creo que la compresión ayudará a resolver su problema. La búsqueda de grandes cantidades de datos nunca fue el propósito de bases de datos relacionales como MySQL.

Tienes un muy buen consejo para Apache Lucene, y hay otras opciones como Sphinxsearch. Aquí hay un hilo rápida en una comparación:

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

+0

Gracias compañero, voy a echar un vistazo a Sphinxsearch. Estoy seguro de que me ayudará. Gracias, porque no he conocido a Sphinxsearch antes. –

2

bien, es muy difícil! (¡al menos para mí!) ... ¡tienes 10 TB de texto y quieres cargarlo en tu base de datos MySQL y realizar una búsqueda de texto completo en las tablas!

Tal vez algunas agrupaciones o algunas formas de rendimiento complicado en un buen hardware funciona para usted, pero si ese no es el caso, puede que le resulte interesante.

En primer lugar, necesita una secuencia de comandos para cargar estos 50,000 millones de texto uno por uno, dividirlos en algunos words y tratarlos como una palabra clave, eso significa darles un id. Numérico y luego guardarlos en una tabla . por cierto I am piece of large text. sería algo como esto:

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

y I'm the next large part! sería:

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

Por cierto palabras I, am, of, I'm, the más ., ! se ha eliminado debido a que no hacen nada por lo general en una búsqueda keyword-based. Sin embargo, puede mantenerlos también en su matriz de palabras clave, si lo desea.

Dale al texto original una identificación única. Puede calcular el md5 del texto original o simplemente dando una identificación numérica. Almacene este id en algún lugar entonces.

Deberá tener una tabla para mantener las relaciones entre texts y keywords. sería una estructura many-to-many así:

[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 

Ahora, imaginemos la cantidad que sería más fácil (especialmente para MySQL!) si alguien large text búsqueda!

Por lo que he encontrado en la 'red, que sería de unos 50,000 o 60,000 de las palabras como palabras clave o máximo 600,000 - 700,000 palabras, si usted acaba de mantener todo como una palabra clave. Entonces, puede simplemente adivinar que 50,000 palabras serían mucho menos que 10 TB de datos basados ​​en texto.

Espero que te ayude, y si necesitas puedo explicarte más o ayudarte a hacer que funcione de alguna manera. :)

+0

¡Guau, increíble! Me encantó tu camino mucho de hecho. ¿Puedes darnos más información? Por cierto, ya he copiado y pegado tu mensaje a mi computadora en caso de que alguien lo elimine. Respuesta perfecta, gracias, pero necesito probarla en mi servidor local. Tomará algún tiempo para probar todo. –

+0

gracias! solo dígame qué partes no son lo suficientemente claras ... en general, diría primero probarlo en unas pocas frases, y luego comenzar a cargar sus datos en eso, pero lentamente. Si ve que funciona correctamente, digamos 200 MB de texto, entonces puede escribir una aplicación c, java, perl para analizar su texto y ponerlo en su base de datos. en PHP, solo necesita realizar la etapa final de búsqueda, que proviene del usuario final. – Mahdi

+0

Esta sería una gran respuesta para mí si me dio información con una muestra. ¿Voy a almacenar información de texto de 10 TB de todos modos? No pude entender su oferta de manera exagerada, sin embargo, sus sonidos son muy interesantes y valen la pena. –

Cuestiones relacionadas