6

説明:巨大なMySQLデータベーステーブルがあります。合計サイズは約10テラバイトです。テキストのみが含まれています。

このデータベーステーブルのサンプルテキスト:

他のケースでは、一部の国は、以前は米国と他のいくつかの国だけが生産できたのと同じ製品とサービスを生産することを徐々に学びました。米国の実質所得の伸びは鈍化している。

約500億の異なるテキストがあります。

私は何を試しましたか?

私はそれらすべてを圧縮しようとしました。実際に動作し、全体のサイズを縮小しました。ただし、検索を行う必要があり、zipファイルにあるデータを検索できません。

base64PHPのエンコーディングを試しました。これにより、サンプルテキストデータは次のようになりました。

SW4gb3RoZXIgY2FzZXMsIHNvbWUgY291bnRyaWVzIGhhdmUgZ3JhZHVhbGx5IGxlYXJuZW QgdG8gcHJvZHVjZSB0aGUgc2FtZSBwcm9kdWN0cyBhbmQgc2VydmljZXMgdGhhdCBwcmV2 aW91c2x5IG9ubHkgdGhlIFUuUy4gYW5kIGEgZmV3IG90aGVyIGNvdW50cmllcyBjb3VsZC Bwcm9kdWNlLiBSZWFsIGluY29tZSBncm93dGggaW4gdGhlIFUuUy4gaGFzIHNsb3dlZC4 =

何を達成したいですか?

MySQLに送信する前に、テキストのサイズを縮小したいと思います。まず第一に、私はこの仕事をどのように行うことができるかわかりません。データの暗号化と復号化を考えています。

だから、これが私がやりたいことの例です:

保存する前にテキストデータを暗号化したい。次に、復号化するためにMySQLから暗号化されたデータを呼び出します。

テキストのサイズを小さくする方法はありますか?Base64は機能しませんが、他に方法はありますか?

4

4 に答える 4

13

また、弦の長さを短くするように設計されていbase64ないことに注意してください。encryptionあなたが見るべきは圧縮であり、私はあなたが見るべきだと思いgzcompressますgzdeflate

テキストのデコードされたバージョンを使用した例

$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;
echo "</pre>";

出力

Using GZ Compress   =  32.86%  Improvement
Using Deflate       =  35.71%  Improvement
于 2012-09-22T19:10:08.223 に答える
4

Base64 は圧縮や暗号化ではなく、エンコードです。データベースに格納する前に gzip 圧縮アルゴリズム (http://php.net/manual/en/function.gzcompress.php) を介してテキスト データを渡すことができますが、基本的に MySQL クエリを介してデータを検索できなくなります。

于 2012-09-22T19:10:33.610 に答える
2

わかりました、それは本当に挑戦的です!(少なくとも私にとっては!) ... 10 TB のテキストがあり、それを MySQL データベースにロードして、テーブルで全文検索を実行したい!

おそらく、優れたハードウェアでのクラスタリングやパフォーマンスのトリッキーな方法がうまくいくかもしれませんが、そうでない場合は、興味深いと思うかもしれません。

まず、これらの 500 億のテキストを 1 つずつロードし、いくつかに分割して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をどこかに保管してください。

と の間の関係を保持するためのテーブルが必要にtextsなりkeywordsます。many-to-many次のような構造になります。

[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

では、誰かがlarge text!

私がネットで見つけた限りでは、すべてをキーワードとして保持する場合、それはキーワードまたは最大の単語50,000について60,000です600,000。したがって、50,000 ワードは、テキストベースのデータ700,000よりもはるかに少ないと簡単に推測できます。10 TB

必要に応じて、さらに説明したり、何らかの形で機能させるのを手伝ったりできます。:)

于 2012-09-22T19:53:38.237 に答える
1

どちらの回答も質問に対処し、テキスト圧縮のオプションを提供しますが、圧縮は問題の解決に役立つと思います。大量のデータを検索することは、MySQL のようなリレーショナル データベースの目的ではありませんでした。

すでに Apache Lucene に関する非常に優れたヒントが得られています。また、Sphinxsearch などの他のオプションもあります。比較に関する簡単なスレッドを次に示します。

全文検索エンジンの比較 - Lucene、Sphinx、Postgresql、MySQL?

于 2012-09-22T19:28:46.357 に答える