2012-09-22 24 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的文字信息?我无法理解你的报价,但你的声音非常有趣,值得追求。 –