Toolsファイル圧縮の形式は世にいろいろありますが、昨今はzipがもっとも一般的でしょうか。zipは圧縮・展開にかかる時間もほどほど、圧縮率もほどほど、そしてWindowsでもLinuxでも対応ソフトウェアあり、など扱いやすさの面でリードしています。そんななか、特定分野で人気なのがXZ形式。圧縮にはパワーも時間も使いますが、zipよりも圧縮率が高くかつ短時間で伸長できる、という性質があります。圧縮は一度で、何度も伸長する、という例えばソースコード一式やインストーラの配布といった用途に向いていると言えるでしょう。圧縮形式、なのでアーカイブ機能はありません。今回はWindows向けにXZ形式の圧縮を実装します。アーカイブ形式としてはTarを使います。速度比較Nimでのプログラム例はじめに単に使えればよい、という側面もありますが圧縮時の負荷が大きいという点からは、やはり少しでも速いほうがいいですよね。(3.x系)ではlzmaモジュールで使えるようになっていますが、今回はNimでも実装して速度を比較してみます。Utils)が提供されており、世に出回っているソフトウェアの多くはそれに依存しているもよう。本体はパブリックドメイン、ツール類を含めるとGPLでライセンスされているようです。直にlzmaモジュールを叩いてもいいのですが、tar作成の関係もありshutilモジュールを利用します。内部的にはlzmaモジュールとtarfileモジュールに依存しているようです。実装はshutilモジュールがかなり抽象化しているので、1行です。"path/to/sourcedir")もとのディレクトリは"path/to/sourcedir"で、サブディレクトリ以下のファイルも含まれます。返り値(上の例ではres)には作成された結果のファイルのパスが入り、この場合は"path/to/destfile.tar.xz"のように拡張子が付加されたものになります。gztarなどが利用できます。Utilsを使います。Windows環境なのでビルド済みのDLLを使ってNimから呼び出すようにします。NimbleにもLZMAのラッパはあるのですが、動かしてみるとどうやらこれはバグっている様子。参考にしつつもファイル圧縮のところのみ抜き出して実装します。Tar作成には別記事の実装を利用します。中間ファイルを吐かずオンザフライに作るよう実装するのが面倒だったので、一旦tarファイルを作成したのち、XZ形式で圧縮することにします。XZのエンコーダは圧縮の始めから終わりまでステートフルになっており、ちゃんとオンザフライ(中間ファイルを作成しないやり方)にするならtarファイルを抽象化するストリームで実装することになると思われます。実際試してみると分かりますが、計算処理の負荷で言えば、tarファイルを作成する処理よりも圧倒的にXZ圧縮の処理のほうが重くなります。XZ圧縮のプログラム例については後ほど記載します。気になるのは速度ですね。appleな比較にはなりませんが、まあご参考までに、ということで。このテストでは、そこらへんにあったディレクトリを圧縮の対象としました。もとのファイル(tar作成時点で)は約120MB、圧縮をかけると約80MBになりました。XZの圧縮オプション(preset)はデフォルト(6)、誤り訂正オプションはCRC(64)です。複数回(7回)実行させた平均値は下記のようになりました。計測のためPythonではtime.time()、Nimではtimes.cpuTime()を使っています。精度は良くないようですが、試行間の差は0~3秒程度でした。34.3[sec]Pythonでの実装(スクリプト)とNimでの実装(バイナリ)を用意しておき、PowerShellからInvoke-Expressionでランダムに呼び出しています。静的型付け言語、Nimのほうが速いですね。世のプロフェッショナルによる枯れた実装があるなら、わざわざ素人が自作する必要はありません。先達に感謝を捧げつつ利用するのみ。かゆい所を色々試してみるのは楽しいものです。Pythonの高速化と言えばNumbaやCythonがありますが、外部のモジュールに依存している場合やうまく処理を切り出せる場合、細かくチューニングしたい場合など、静的言語を使うのもアリかもしれませんね。詳細は省略しますが、Nimでliblzma.dllのラッパを実装した例(というか上記のパクリ)が下記です。xzプロシージャにファイルパスを渡すと、対象のファイルと同じ場所でXZ圧縮をかけます。元のファイルは削除しません。objectを用意してコンパイルすれば動くと思います。usta関連記事Cron(crontab)の設定Cronと言えばLinuxでデファクトのジョブスケジューラ。UpdateでHyper-Vの仮想スイッチが使えなくなった話タイトルの通りです。やってみて何とか解決?したので書いておきます。10)を使っていると、画面の...記事を読むAnsibleの始め方Linuxが立ち上がって、SSHログインできるマシンがあったとしましょう。それでもサーバとして使うには、gitやらhttpdやらをyum/a...記事を読むpycryptoでAES暗号化を試す認証機能はWebサービスを作るときに重要ですが、パスワードの保管って厄介ですよね。Cookieやらスクリプトに平文を直書きするのは抵抗があり...記事を読むリモートレポジトリ作成をAnsibleで自動化するGitでコードを共有するのにリモートレポジトリを作成したいがGithubへのアクセスや社内のGitlabサーバはない、そんなときはふつうのL...記事を読むpysmbを使ってPythonでWindowsファイルサーバにアクセスするWindowsファイルサーバ(SMB)をスクリプトから操作するとき、ネイティブにはPowerShellですが、Pythonで実装するとLin...記事を読むdatetimeモジュールによる時刻の扱いどのプログラミング言語/スクリプトでも、時刻と文字列の変換は頻出の処理ですね。ここではPythonの標準モジュールdatetimeを使っ...記事を読むPythonとElasticsearchの夕べElasticsearchの魅力の一つは豊富な機能。その分、使いこなすのが大変なので、少しでも実例ベースで勉強したいところです。...記事を読むGitで始めるバージョン管理もはやバージョン管理と言えばGitですね。これさえ覚えておけば、という頻出のコマンド例をメモしておきます。APIを作成するBottleはPythonの軽量Webフレームワーク。コメントをキャンセルメールアドレスが公開されることはありません。コメントデータの処理方法の詳細はこちらをご覧ください。