
Contents
実行環境 Windows 7 + PostgreSQL 9.5.0 に PL/v8 をインストール PostGIS 2.2 のインストールは 9.5 RC1 の時と同様(以上、1 月 23 日) PNG ファイルをインポートして PostGIS ラスタのサンプルデータを作る インポートしたラスタを再び PNG ファイルに出力して確認(以上、1 月 24 日) PostGIS ラスタで画像処理、続けて PNG ファイルに出力するテンプレート PostGIS の関数のソースを見て、PL/v8 への置き換えを考える(以上、1 月 25 日) コールバック関数 ST_Range4ma の PL/v8 版を作る PL/pgSQL の単純化バージョンも作る SQL でもコールバック関数を作る テストの全体(以上、1 月 26 日) - コールバック関数
4 つ × 周辺範囲 5 つ × 複数回テスト、を一つのクエリで - テスト結果の
TSV を PostgreSQL にインポート - PL/v8
の方が、元からある PL/pgSQL の数倍速い (以下、1 月 31 日) テスト結果の PostgreSQL テーブルを R で読み込む 今回のテストと外れ値、95% 信頼区間について 全体を一つの棒グラフにまとめる(エラーバー付) ピクセル範囲から所要時間を予測する回帰式(関数別) 全体のまとめ
コールバック関数 4 つ × 周辺範囲 5 つ × 複数回テスト、を一つのクエリで
種類の多いテストを複数回実行して処理時間を測るため ↓ の無名コードブロックを作りました。最初の変数do $$ declare trial int := 5; func_pres text[] := '{st, simple, plv8, sql}'; func_pre text; ranges int[] := '{0, 1, 2, 3, 4}'; range int; ts timestamp; sec float; outfile text := 'R:/range4ma_times.tsv'; begin -- output column header and initialize outfile execute format('copy (values(%L, %L, %L, %L)) to %L', 'trial', 'func_pre', 'range', 'sec', outfile); -- trials for i in 1..trial loop for func_pre in select unnest(func_pres) loop for range in select unnest(ranges) loop ts := clock_timestamp(); -- execute function perform ST_MapAlgebra(rast, 1, (func_pre || '_range4ma(float[][][], int[][], text[])') :: regprocedure, '8BUI', 'FIRST', NULL, range, range) from adbadge_tall; -- get duration sec := extract(epoch from clock_timestamp() - ts); -- append result to file execute format('copy (values(%L, %L, %L, %L)) to program %L', i, func_pre, range, sec, 'find /v "" >> "' || outfile || '"'); -- show status raise info '%, %, %, %', i, func_pre, range, sec; end loop; end loop; end loop; end; $$;
前回までは画像処理の結果を
この
FIND
今回は追記書き込みなので、FIND
copy (select 1, 2, 3) to program 'find /v "" > "R:/test.tsv"'; copy (select * from generate_series(2, 9)) to program 'find /v "" >> "R:/test.tsv"';


↓ テスト実行中の様子と、結果のファイル(COPY


テスト結果の TSV を PostgreSQL にインポート
20create table result_range4ma ( trial int, func_pre text, pixel_range int, sec float); copy result_range4ma from 'R:/range4ma_times.tsv' (format csv, delimiter E'\t', header true); -- Check select * from result_range4ma;

PL/v8 の方が、元からある PL/pgSQL の数倍速い
今回は東芝- CPU: Intel Core i7-4600U(2.1GHz)
- Memory: 8
GB


前項で取り込んだテスト結果のうち、ピクセル範囲
select repeat(func_pre, 1 / trial) as func, repeat(to_char(min(sec) over w, dig), 1 / trial) as "min(sec)", repeat(to_char(max(sec) over w, dig), 1 / trial) as "max(sec)", trial, to_char(sec, dig) as sec from result_range4ma, (values ('999.999')) as x(dig) where pixel_range = 4 window w as (partition by func_pre) order by min(sec) over w, trial ; +--------+----------+----------+-------+----------+ | func | min(sec) | max(sec) | trial | sec | +--------+----------+----------+-------+----------+ | plv8 | 14.742 | 14.898 | 1 | 14.789 | | | | | 2 | 14.836 | | | | | 3 | 14.773 | | | | | 4 | 14.742 | | | | | 5 | 14.898 | | sql | 28.439 | 28.766 | 1 | 28.595 | | | | | 2 | 28.766 | | | | | 3 | 28.439 | | | | | 4 | 28.766 | | | | | 5 | 28.657 | | simple | 70.965 | 71.293 | 1 | 71.152 | | | | | 2 | 71.011 | | | | | 3 | 71.167 | | | | | 4 | 71.293 | | | | | 5 | 70.965 | | st | 87.937 | 108.919 | 1 | 88.126 | | | | | 2 | 108.919 | | | | | 3 | 87.937 | | | | | 4 | 88.374 | | | | | 5 | 88.453 | +--------+----------+----------+-------+----------+ (20 rows)

ただし普通の画像処理アプリと比べると、PL/v8
ところで今回ならったPostgres Online Journal
- PL/v8 : 8.241 sec
- SQL : 17.701 sec
- 元からある
PL/pgSQL : 51.922 sec
自分のテストのうち、最も計算量が少ないピクセル範囲
select repeat(func_pre, 1 / trial) as func, repeat(to_char(min(sec) over w, dig), 1 / trial) as "min(sec)", repeat(to_char(max(sec) over w, dig), 1 / trial) as "max(sec)", trial, to_char(sec, dig) as sec from result_range4ma, (values ('999.99')) as x(dig) where pixel_range = 0 window w as (partition by func_pre) order by min(sec) over w, trial ; +--------+----------+----------+-------+---------+ | func | min(sec) | max(sec) | trial | sec | +--------+----------+----------+-------+---------+ | plv8 | 2.18 | 2.25 | 1 | 2.22 | | | | | 2 | 2.25 | | | | | 3 | 2.18 | | | | | 4 | 2.22 | | | | | 5 | 2.23 | | simple | 5.38 | 5.44 | 1 | 5.44 | | | | | 2 | 5.40 | | | | | 3 | 5.38 | | | | | 4 | 5.44 | | | | | 5 | 5.43 | | st | 7.41 | 7.58 | 1 | 7.53 | | | | | 2 | 7.43 | | | | | 3 | 7.58 | | | | | 4 | 7.41 | | | | | 5 | 7.53 | | sql | 7.43 | 7.69 | 1 | 7.49 | | | | | 2 | 7.53 | | | | | 3 | 7.69 | | | | | 4 | 7.43 | | | | | 5 | 7.52 | +--------+----------+----------+-------+---------+ (20 rows)

あと、先ほど載せたピクセル範囲