画像サーバ

画像ファイルや動画ファイルのピクセルデータを取得する処理を、 別プロセスのサーバに切り出してみます。

まぁこんな事をしたら、普通、動作は遅くなるはずです。

これは明日のための布石です。

ややこしいので、従来の交点を求めたりするサーバは、 rt server (レイトレサーバ) とでも呼んで区別するようにします。

v26.patch

$ cat v26.patch | ( cd rt ; patch -p1 )

$ cd rt

$ make clean
$ make

いつものデータで速度比較。

まず従来方式

$ ./cg.py eyep=[0,0,0],200,10 sec=10 data_name=objs name=out_v26/objs_1_2 n=1 init_sec=5 div=2
  :
wh : 76800/76800(100.0%) : fin 7m 31.17s

  以前の
  v25  wh : 76800/76800(100.0%) : fin 7m 50.96s
  v24  wh : 76800/76800(100.0%) : fin 7m 44.42s
  v23  wh : 76800/76800(100.0%) : fin 7m 48.33s

イメージ用のサーバプロセスを使う場合は

$ ./cg.py eyep=[0,0,0],200,10 sec=10 data_name=objs name=out_v26/objs_1_2_is n=1 init_sec=5 div=2 use_img_srv
  :
wh : 76800/76800(100.0%) : fin 8m 12.84s

( (8*60+12.84) / (7*60+31.17) - 1 ) * 100 = 9.23 パーセント低下

サーバプロセス分離版

$ ./cg.py eyep=[0,0,0],200,10 sec=10 data_name=objs name=out_v26/objs_1_2_s n=1 init_sec=5 div=2 use_srv
  :
wh : 76800/76800(100.0%) : fin 9m 22.96s

  以前の
  v25  wh : 76800/76800(100.0%) : fin 9m 34.91s
  v24  wh : 76800/76800(100.0%) : fin 9m 38.24s
  v23  wh : 76800/76800(100.0%) : fin 9m 9.07s

$ rm xdat

イメージ用のサーバプロセスを使う場合は

$ ./cg.py eyep=[0,0,0],200,10 sec=10 data_name=objs name=out_v26/objs_1_2_s_is n=1 init_sec=5 div=2 use_srv use_img_srv
  :
wh : 76800/76800(100.0%) : fin 9m 54.44s

$ rm xdat

( (9*60+54.44) / (9*60+22.96) - 1 ) * 100 = 5.59 パーセント低下

別プロセスのところをC言語で実装版

$ ./cg.py eyep=[0,0,0],200,10 sec=10 data_name=objs name=out_v26/objs_1_2_sc n=1 init_sec=5 div=2 use_srv srv_c
  :
wh : 76800/76800(100.0%) : fin 53.40s

  以前の
  v25  wh : 76800/76800(100.0%) : fin 53.95s
  v24  wh : 76800/76800(100.0%) : fin 54.07s
  v23  wh : 76800/76800(100.0%) : fin 1m 50.29s

イメージ用のサーバプロセスを使う場合は

$ ./cg.py eyep=[0,0,0],200,10 sec=10 data_name=objs name=out_v26/objs_1_2_sc_is n=1 init_sec=5 div=2 use_srv srv_c use_img_srv
  :
wh : 76800/76800(100.0%) : fin 1m 6.02s

( (1*60+6.02) / 53.40 - 1 ) * 100 = 23.63 パーセント低下

まぁそうですね。 画像のピクセルデータ取得処理に比べて、 他の箇所が速いほど低下は大きくなります。

では、v25の接近パターンの続きを...

$ ./cg.py eyep=[0,0,0],50,20 sec=10 data_name=ball_world name=out_v26/bw_near_2 div=2 use_srv srv_c use_img_srv init_sec=10
  :
wh : 75840/76800(98.8%) : total 3m 3.55s : rest 2.29s : 2018/04/21 13:43:12
wh : 76444/76800(99.5%) : total 3m 3.10s : rest 0.84s : 2018/04/21 13:43:12
wh : 76800/76800(100.0%) : fin 3m 2.88s
frm : 81/300(27.0%) : total 14h 36m 51.49s : rest 10h 40m 6.39s : 2018/04/22 00:23:18
wh : 0/76800(0.0%) : not start yet
Traceback (most recent call last):
  File "./img_sock.py", line 158, in 
    f()
  File "./img_sock.py", line 137, in col
    col = img.col(*lst)
  File "/Users/kondoh/rt_wk/rt_v26/img.py", line 139, in col
    return videos.col(fn, sec, x, y, def_col, rep)
  File "/Users/kondoh/rt_wk/rt_v26/img.py", line 102, in col
    return img_sec(fn, sec)[y, x]
TypeError: 'NoneType' object is not subscriptable
Traceback (most recent call last):
  File "./cg.py", line 304, in 
    f(data, lights, eye2g, wh2eye, sc_sz, video)
  File "/Users/kondoh/rt_wk/rt_v26/rt.py", line 149, in draw
    col = get_col(data, lights, l_g, sec)
  File "/Users/kondoh/rt_wk/rt_v26/rt.py", line 132, in get_col
    col_ = reflact_col()
  File "/Users/kondoh/rt_wk/rt_v26/rt.py", line 129, in reflact_col
    col = get_col( data, lights, ref_l, sec, nest_rate * reflact, d )
  File "/Users/kondoh/rt_wk/rt_v26/rt.py", line 132, in get_col
    col_ = reflact_col()
  File "/Users/kondoh/rt_wk/rt_v26/rt.py", line 129, in reflact_col
    col = get_col( data, lights, ref_l, sec, nest_rate * reflact, d )
  File "/Users/kondoh/rt_wk/rt_v26/rt.py", line 87, in get_col
    col = map_col( crs, rev, sec )
  File "/Users/kondoh/rt_wk/rt_v26/rt.py", line 43, in map_col
    cols = ut.filter_lst( lambda col: col != [], cols )
  File "/Users/kondoh/rt_wk/rt_v26/ut.py", line 14, in 
    filter_lst = lambda f, lst: list( filter( f, lst ) )
  File "/Users/kondoh/rt_wk/rt_v26/rt.py", line 40, in f
    return col_func( fn, sec, int(x), int(y), [], m.get('rep') )
  File "/Users/kondoh/rt_wk/rt_v26/img_sock.py", line 79, in col
    (col_, s) = bin.unpack_col(s)
  File "/Users/kondoh/rt_wk/rt_v26/bin.py", line 27, in unpack_col
    ( col[i], s ) = unpack_i4(s)
  File "/Users/kondoh/rt_wk/rt_v26/bin.py", line 17, in 
    unpack_i4 = lambda s: ( struct.unpack_from('=i', s)[0], s[4:] )
struct.error: unpack_from requires a buffer of at least 4 bytes

!?