2015年2月16日月曜日

[kdb] File Compression

ファイル圧縮に関するあれこれ

□ kxwiki - Cookbook/FileCompression
http://code.kx.com/wiki/Cookbook/FileCompression


□ contrib
Simon / compress - utilities for compressing kdb+ databases
Simon作成のcontribが便利そうなので、これを使うことにする。

・cutil.qの使い方(一部)
下部のsample sessionに記載の通り、infoテーブルを回しながら、
cinfo -> cuse -> cwrire -> cmv
と実行すればよい。cwriteでtdに指定したディレクトリに圧縮し、cmvで元のファイルを上書きしている。
圧縮済みのディレクトリを対象にしても再度圧縮することはなさそう。
cuse には何種類かバージョンが作成されている。gzipで圧縮する場合はcusegz、 kdb+ipcで圧縮する場合はcusekxを選べばよい。なお、32bit版kdb+でgzip圧縮を使う場合は、32bit版zlibが必要なので注意。(インストール方法のページ参照)
複数の日付・テーブル・カラムを対象にする場合のやり方は、build a bulk request として最下部に記載されている。カラムとかを可変にしたかったので、以下の関数を作成。
//
// 指定ディレクトリ以下をすべて圧縮します。
//
compressAll: {[fromdir;tempdir]
    // prepare
    partitionList: key fromdir:hsym fromdir;
    partitionList: partitionList where partitionList <> `sym;
    tableList: key ` sv fromdir,partitionList[0];
    tempdir: hsym tempdir;
    
    // execute
    {[d;td;partition_table]
        p: partition_table[0];
        t: partition_table[1];
        info:cinfo[d;td;p;t];
        /info:cusekx info;
        info:cusegz info;
        info:cwrite info;
        cmv info:cvalidate info;
    }[fromdir;tempdir;] each cross[partitionList;tableList]
  };

// example
/ compressAll[`:/data/kdb/xxx;`:/data/kdb/work]


・圧縮状態の確認
圧縮状態の一括で確認する方法が見つからなかったので、関数を作成してみた。
グローバルオブジェクトを作成してしまうのは、まあそんなもので。
//
// 指定ディレクトリ以下のすべての圧縮状態を取得します。
//
showCompressionInfo: {[dir]
    CompressStatus:: ([]date:`$();table:`$();col:`$();size:`long$();compressedLength:`long$();uncompressedLength:`long$();algorithm:`int$();logicalBlockSize:`int$();zipLevel:`int$());

    partitionList: key dir:hsym dir;
    partitionList: partitionList where partitionList <> `sym;
    tableList: key ` sv dir,partitionList[0];
    
    {[dir;partition_table]
        partition: partition_table[0];
        table: partition_table[1];
        // column list
        colList: key ` sv dir,partition,table;
        // remove .d
        colList: colList where colList <> `.d;
        // get compresstion statistics
        CompressStatus,:
        {[dir;partition;table;col]
            file: ` sv dir,partition,table,col;
            size: hcount file;
            res: `date`table`col`size`compressedLength`uncompressedLength`algorithm`logicalBlockSize`zipLevel!(partition;table;col;size;0Nj;0Nj;0N;0N;0N);
            res,: -21! file;
            select date, table, col, size, `long$compressedLength, `long$uncompressedLength, `int$algorithm, `int$logicalBlockSize, `int$zipLevel from res
        }[dir;partition;table;] each colList;
    }[dir;] each cross[partitionList;tableList];
    
    // return compression status
    :CompressStatus
  };

// example
/ showCompressionInfo[`:/data/kdb/xxx]

0 件のコメント:

コメントを投稿