34

7.4Gb の csv ファイルがあります。Python スクリプトを使用して sqlite データベースに変換した後、出力 DB は 4.7Gb で、元のサイズの約 60% です。

csv には約 150,000,000 行あります。ヘッダーがあります:

tkey,ipaddr,healthtime,numconnections,policystatus,activityflag

そして、各行は次のようになります

261846,172.10.28.15,2012-02-03 16:15:00,22,1,1

スクリプトは healthtime を使用してデータをテーブルに分割します 192 テーブル

これらの数字を最初に見たとき、どこかで間違いを犯したと思いました。healthtime を 1 億 5000 万回ではなく 192 回だけ書き込むことで効率が向上すると、ファイル サイズはどの程度削減されるのでしょうか。

編集:これを投稿するとすぐに、答えに気づきました。文字列の約 40% を削除しているため、サイズが 40% 縮小されています。

編集 2プレーン テキストのサイズの違いを計算してみましょう。

"261846,172.10.28.15,2012-02-03 16:15:00,22,1,1" 

そしてデータベースエントリ:

db(261846,'172.10.28.15',22,1,1)

まず、プレーン テキスト表現で 46 文字から 26 文字に減らします。

残りの文字は次のとおりです。

"261846,172.10.28.15,22,1,1"

または26バイト。各整数を 32 ビット (4 バイト) で格納する必要がある場合は、次のようになります。

12 バイト (ipaddr) + 4 バイト * 4 (整数フィールド) = 28 バイト。

したがって、整数に変換するとストレージの効率がわずかに低下するように見えますが、すべての利点は、各行に格納される文字数を減らすことから得られます。

4

3 に答える 3

37

SQLite は圧縮アルゴリズムを実行していませんが、テキスト ファイルではなくバイナリ ファイルにデータを保存します。つまり、データを10,000,0008 バイトのテキスト (またはファイルが Unicode の場合はそれ以上) として格納する代わりに、32 ビット (4 バイト) の数値を使用して表現するなど、データをより効率的に格納できます。

興味のある方は、 SQL データベース ファイル形式の詳細をご覧ください。

それは理にかなっていますか?

于 2012-05-30T21:18:07.450 に答える
21

デフォルトでは、SQLite はディスクに書き込むデータを圧縮しません。ただし、SQLite には、その目的およびその他の目的のための一連の「独自の拡張機能」があります。ZIPVFS以下のリンク先で探してください。

http://www.sqlite.org/support.htmlおよび http://www.hwaci.com/sw/sqlite/prosupport.html

フィールドを整数としてエンコードすることにより、データの多くの「圧縮」を実現できます。たとえば、IP アドレスは 1 ワード (4 バイト) に収まるように設計されています。アドレスの各オクテットは、ワードの 1 バイトで表すことができます。

string[] octets = '172.168.0.1'.split('.')
int ip = atoi(octets[0]) << 24
ip |= atoi(octets[1]) << 16
ip |= atoi(octets[2]) << 8
ip |= atoi(octets[3])

さらに、タイムスタンプは、エポックからの秒数である Unix 時間で表される場合があります。

UPDATE mytable SET healthtime = CAST(strftime('%s',healthtime) AS INTEGER);

日付と時刻の関数を参照してください

上記の SQLのディレクティブに注意してくださいCAST。SQLite は列に型を強制しないため、数字のグループが文字列として格納される場合があります。フィールド サイズを必要以上に大きくします (これにより、特定のクエリの動作がおかしくなることもあります)。

もう 1 つ: フィールド サイズだけが問題ではありません。インデックスもスペースを占有することに注意してください。ディスク サイズとパフォーマンスの点では、整数のインデックスの方が効率的です。

于 2013-12-04T01:40:56.093 に答える