2012-09-22 4 views
5

설명 : 나는 거대한 MySQL 데이터베이스 테이블을 가지고있다. 총 크기는 약 10 테라 바이트입니다. 텍스트 만 들어 있습니다.텍스트의 크기를 줄이는 방법은 없습니까?

이 데이터베이스 테이블에서 샘플 텍스트 : 다른 경우

는 일부 국가는 점차 같은 제품과 미국 및 다른 몇 나라 이전 만이 생산할 수있는 서비스를 생산하는 배웠습니다. 미국의 실질 소득 증가는 둔화되었다.

약 500 억 개의 서로 다른 텍스트가 있습니다.

무엇을 시도 했습니까?

나는 모두 압축하려고했습니다. 사실 그것은 효과가 있었고, 전체 크기를 줄였습니다. 그러나 검색을해야하며 Zip 파일에있는 동안 데이터를 검색 할 수 없습니다.

PHP의 base64 인코딩을 시도했습니다. 그것은 나의 샘플 텍스트 데이터를했다 :

SW4gb3RoZXIgY2FzZXMsIHNvbWUgY291bnRyaWVzIGhhdmUgZ3JhZHVhbGx5IGxlYXJuZW QgdG8gcHJvZHVjZSB0aGUgc2FtZSBwcm9kdWN0cyBhbmQgc2VydmljZXMgdGhhdCBwcmV2 aW91c2x5IG9ubHkgdGhlIFUuUy4gYW5kIGEgZmV3IG90aGVyIGNvdW50cmllcyBjb3VsZC Bwcm9kdWNlLiBSZWFsIGluY29tZSBncm93dGggaW4gdGhlIFUuUy4gaGFzIHNsb3dlZC4 = 내가 달성하고 싶은 무엇

?

MySQL로 보내기 전에 텍스트 크기를 줄이려고합니다. 우선, 나는이 일을 어떻게 할 수 있는지 모른다. 데이터 암호화 및 해독을 고려 중입니다.

내가 저장하기 전에 텍스트 데이터를 암호화 할 :

그래서, 여기에 내가 무엇을 원하는 예입니다. 그런 다음 암호를 해독하기 위해 MySQL에서 암호화 된 데이터를 호출하려고합니다.

텍스트의 크기를 줄이는 방법은 없습니까? Base64가 나를 위해 작동하지 않습니다, 다른 방법이 있습니까?

+0

전체 텍스트 검색이 필요합니까? 이 경우 압축 할 수 없거나 MySQL이 텍스트를 크롤링 할 수 없습니다. 어쨌든 여기에 데이터베이스 내용을 붙여 넣으십시오. – moonwave99

+2

아마도 Lucene http://lucene.apache.org/가 당신이 찾고있는 것입니다. 당신이 공모하려고하는 것을 위해 만들어졌습니다 : 많은 양의 텍스트로 검색하기 –

+0

그래, 전체 텍스트 검색이 필요해. –

답변

9

문자열 길이를 줄이기 위해 base64 또는 encryption을 사용하지 않았습니다. 당신은 무엇을보고해야하는 것은 압축하고 난 당신이 당신의 압축되지 않은 텍스트

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

출력

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

그래, 작동 :) 내 localhost에서 해봤습니다. 완벽한 도움 동료 !! 고맙습니다. 그게 내가 원하는거야. 또한 Dirk은 Apache Lucene을 제안했습니다.나는 둘 다 사용할거야. –

+0

쿨 .. 다행스럽게 도울 수있었습니다. – Baba

3

Base64로 또는 암호화의 디코딩 버전을 사용 gzcompressgzdeflate

예를 살펴한다고 생각합니다 , 그것은 인코딩입니다. 데이터베이스에 저장하기 전에 gzip 압축 알고리즘 (http://php.net/manual/en/function.gzcompress.php)을 통해 텍스트 데이터를 전달할 수 있지만 기본적으로 MySQL 쿼리를 통해 데이터를 검색 할 수 없게됩니다.

1

두 가지 대답 모두 질문에 답하고 텍스트 압축 옵션을 제공하지만 압축은 문제를 해결하는 데 도움이 될 것입니다. 많은 양의 데이터를 검색하는 것은 MySQL과 같은 관계형 데이터베이스의 목적이 아닙니다.

아파치 루씬 (Apache Lucene)을위한 팁이 아주 좋으며, 스핑크스 검색과 같은 다른 옵션이 있습니다. 여기에 비교에 빠른 스레드입니다 :

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

+0

친구 사귈 주셔서 감사합니다. 스핑크스 검색을 살펴 보겠습니다. 나는 그것이 나를 도울 것이라고 확신한다. 고맙습니다. 전에 스핑크스르를 몰랐기 때문에. –

2

좋아, 정말 도전입니다! (적어도 나를 위해!) ... 당신은 10TB의 텍스트를 가지고 있고 그것을 MySQL 데이터베이스에로드하고 테이블에 대한 전문 검색을 수행하고 싶습니다!

좋은 하드웨어에서 일부 클러스터링 또는 성능 저하가 발생하지만 어쨌든 재미있을 수도 있습니다.

먼저 500 억 개의 텍스트를 하나씩로드하고 words으로 나누어 키워드로 처리하면 숫자 ID를 부여한 다음 테이블에 저장하는 스크립트가 필요합니다. .

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

I'm the next large part!은 다음과 같습니다 :

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

그들이 keyword-based 검색에서 일반적으로 아무것도하지 않기 때문에 I, am, of, I'm, the 플러스 ., !이 제거 된 방식 단어 그런데 I am piece of large text. 이런 일이 될 것입니다. 그러나 원할 경우 키워드 배열에도 보관할 수 있습니다.

원본 텍스트에 고유 한 ID를 부여하십시오. 원래 텍스트의 md5을 계산하거나 단순히 숫자 ID를 제공 할 수 있습니다. 이 id을 어딘가에 저장하십시오.

textskeywords 사이의 관계를 유지하려면 테이블이 있어야합니다.

이제
[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 

이 (특히 MySQL을 위해!) 쉽게 될 것입니다 얼마나 상상 누군가 검색 large text 경우 :이 같은 many-to-many 구조가 될 것입니다! 그냥 키워드로 모든 것을 유지하는 경우, 700,000 단어 -

은 지금까지 나는 '그물에 발견, 그것은 약 50,000 또는 키워드로 단어의 60,000 또는 최대 600,000 될 것이다. 따라서 5 만 단어가 텍스트 기반 데이터 인 10 TB보다 훨씬 작을 것이라고 간단히 추측 할 수 있습니다.

도움이되기를 바랍니다. 필요한 경우 더 설명하거나 어떻게 든 도와 줄 수 있습니다. :)

+0

놀랍군! 나는 네 길을 참으로 사랑했다. 좀 더 자세한 정보를 주시겠습니까? BTW, 누군가 이미 삭제 한 경우 내 컴퓨터에 메시지를 복사하여 붙여 넣었습니다. 완벽한 답변, 고마워,하지만 내 localhost에서 테스트해야합니다. 모든 것을 테스트하는 데 시간이 걸릴 것입니다. –

+0

감사합니다! 그냥 어떤 부분이 충분하지 않은지 알려주십시오 ... 일반적으로 먼저 몇 문장으로 테스트 해보고 데이터를로드하기 시작합니다.하지만 천천히하십시오. 제대로 작동한다는 것을 알았다면 200MB의 텍스트를 말한 다음 c, java, perl 응용 프로그램을 작성하여 텍스트를 구문 분석하여 데이터베이스에 저장하십시오. PHP 측에서는 최종 사용자가 제공하는 최종 검색 단계 만 수행하면됩니다. – Mahdi

+0

샘플로 정보를 주시면 큰 도움이 될 것입니다. 어쨌든 10 TB 텍스트 정보를 저장할 예정입니까? 나는 당신의 제안을 exatcly 이해할 수 없지만, 당신의 소리는 매우 흥미롭고 추구할만한 가치가 있습니다. –

관련 문제