2012-09-22 31 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是專爲減少字符串長度。什麼,你應該看到的是壓縮,我認爲你應該看看gzcompressgzdeflate

示例使用文本

$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

是的,它的工作:)我已經在我的本地主機上試過了。完美的幫助隊友!非常感謝你。這就是我想要的。而且,Dirk建議我使用Apache Lucene。我會使用他們兩個。 –

+0

酷..高興我能幫助 – Baba

3

Base64是不壓縮或加密的解碼版本,它是編碼。在將數據存儲到數據庫中之前,您可以通過gzip壓縮算法(http://php.net/manual/en/function.gzcompress.php)傳遞文本數據,但這基本上會通過MySQL查詢使數據無法搜索。

1

雖然這兩個答案都提出了問題並提供了文本壓縮選項,但我認爲壓縮有助於解決您的問題。搜索大量數據從來都不是像MySQL這樣的關係數據庫的目的。

對於Apache Lucene,你有一個非常好的提示,還有其他選項,如Sphinxsearch。這裏有一個比較快線:

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

+0

謝謝隊友,我要去看看Sphinxsearch。我相信它會幫助我。謝謝,因爲我之前還不知道Sphinxsearch。 –

2

好,它是真正具有挑戰性的! (至少對我來說!)...你有10TB的文本,你想把它加載到你的MySQL數據庫上並在表格上執行全文搜索!

也許在一個好的硬件上有一些集羣或者一些性能很棘手的方法適用於你,但是如果情況並非如此,你可能會覺得它很有趣。

首先,你需要一個腳本來只加載這50十億一段文字之一之後對方,他們分成一些words,並把它們作爲關鍵字,這意味着給他們一個數字ID,然後將它們保存在一個表。順便說I am piece of large text.會是這樣的:

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

I'm the next large part!是:

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

順便說的話I, am, of, I'm, the., !已經被淘汰,因爲他們沒有什麼通常在keyword-based搜索。但是,如果您願意,您還可以將它們保存在關鍵字數組中。

給原始文本一個唯一的ID。您可以計算原始文本的md5或者只是簡單地給出數字ID。然後在某處存儲此id

您將需要一個表格來保持textskeywords之間的關係。這將是一個many-to-many結構是這樣的:如果有人搜索large text

[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的!)!

至於我對「網發現,這將是約50,000或單詞的60,000作爲您的關鍵字或最大600,000 - 700,000的話,如果你只是把一切都爲關鍵字。所以,你可以簡單地猜測50,000個單詞將遠遠少於基於文本的數據的10 TB

我希望它有幫助,如果你需要,我可以更多地解釋或幫助你做出某種程度上的工作! :)

+0

哇,太棒了!我非常喜歡你的方式。你能否給我們提供更多信息?順便說一句,我已經複製並將你的消息粘貼到我的電腦,以防有人刪除它。完美的答案,謝謝,但我需要在我的本地主機上測試它。測試一切將需要一些時間。 –

+0

謝謝!只是讓我知道哪些部分不夠清晰...通常我會說先用幾句話測試它,然後開始將數據加載到該數據中,但是速度很慢。如果你發現它可以正常工作,比方說200MB的文本,那麼你可以編寫一個c,java,perl應用程序來解析你的文本並將它放到你的數據庫中。在PHP方面,您只需執行來自最終用戶的搜索的最後階段。 – Mahdi

+0

如果你給我一個樣品的信息,這將是很好的答案。無論如何,我是否會儲存10 TB的文字信息?我無法理解你的報價,但你的聲音非常有趣,值得追求。 –