以前の記事で,PythonのMatplotlib+Seabornのグラフを非Python実行環境のWindowsから.pngを生成するexeを作成した.
しかし,実行時間が長い(4秒)ので,あらかじめ.exeを立ち上げておいて,プロセス間通信で受け付ける方針で作成してみた.
期待される改善としては,
1.importが省略されるため,オーバヘッドの時間が削減される.
2.プロセス間通信なので,ファイルとしてではなくBYTEデータで直接やり取りできる.
→でもまずは,1.だけのやつを作ります
#プロセス間通信(Scoket通信)
この記事を参考に,プロセス間通信を作る.
最終的には,データ送信もデータ返信もBYTEで直接授受したいと思うが,まずはトリガだけ別プロセスからやる.
引数付き実行をやめて,Socket通信のClientから指示する方針で.
(シンプルに,カンマ渡しを.split(",")で分離にしています)
###Server側
import socket
#Define the host and port
host = 'localhost'
port = 64123 #適当なport
#socket connect
serversock = socket.socket(socket.AF_INET,socket.SOCK_STREAM)
serversock.setsockopt(socket.SOL_SOCKET,socket.SO_REUSEADDR,1)
serversock.bind((host,port))
serversock.listen(1)
if __name__ == '__main__':
client_socket, client_address = serversock.accept()
while True:
#Message待ち
rcvMsg = client_socket.recv(2048)
#Message受信
print('Receive data : %s' % (rcvMsg))
rcvMsg = rcvMsg.decode('utf-8').split(',')
#形式あってるかチェックとかする
Args1 = rcvMsg[0]
Args2 = rcvMsg[1]
Args3 = rcvMsg[2]
###処理部記載###
s_msg = 'Finish'
s_msg = s_msg.encode('utf-8')
client_socket.sendall(s_msg)
print('Send finish')
client_socket.close()
###Client側
import socket
host = 'localhost'
port = 64123 #任意のLocal Port.Serverに合わせる.
#Socket通信開始
client = socket.socket(socket.AF_INET, socket.SOCK_STREAM)
client.connect((host, port))
while True:
print('input command...')
massage = input().encode('utf-8')
client.send(massage)
response = client.recv(4096)
#WhileのBreak条件入れてね
client.close()
こんな感じのServerとClient作って,
Clientからカンマ区切りで電文渡す→Serverで処理実行
といった作りにしました.
#seabornが遅い(-_-;)ので,imshowに変更
せっかくオーバーヘッドがなくなったので,グラフ生成までの時間を計測.
まずはPythonでServer+Client作って動作確認.
0.2~0.4秒くらい.
これでもまぁ使えるけど,欲を言えばもう少し早くしたい.
どこが遅いんじゃー??
###1. seabornでのheatmap生成
def Heatmap(data):
ax = sns.heatmap(data)
return ax
~0.1秒
###2. filesave
plt.savefig(os.path.join(save_path,save_name),facecolor="blue")
~0.15秒
まずは1.について調べると,Seabornは遅いので,Matplotlibのimshowでやることにした.
###3.Matplotlibのimshowでheatmap生成
def HeatMapFast(data):
plt.figure()
plt.imshow(data,interpolation='nearest',vmin=0,vmax=15,cmap='rainbow')
plt.colorbar()
#bx = plt.show()
return plt
~0.05
これでheatmap作成部分はいったんOK.
次は2.について.
savefigを実保存せずに,[メモリ上に展開する方法について調査]
(https://qiita.com/kaito__/items/9aa63cccc99261814065)
この方法では実行処理は一切変わらなかった.
グラフを保存する前に行う処理で時間がかかっているようだ.
この部分は今後の課題.
##使用パッケージ,ライブラリ
import time
import socket
import os
import numpy as np
import seaborn as sns
import matplotlib.pyplot as plt
##Server実処理部分参考
#dataは2次元配列の.csvファイル
data = np.loadtxt(load_path,delimiter=",")
#seabornのヒートマップ
hoge = Heatmap(data)
hoge.plot()
plt.savefig(os.path.join(save_path,save_name),facecolor="blue")
#matplotlibのヒートマップ
hogehoge = HeatMapFast(data)
hogehoge.savefig(os.path.join(save_path,save_name2))
#結果
loadCSV:0.000997781753540039[sec]
HeatMap():0.09075665473937988[sec]
SaveFig:0.115692138671875[sec]
HeatMapFast():0.05684828758239746[sec]
SaveFig2:0.13364338874816895[sec]
ここまでにはなりました.
HeatMap()がSeaborn,HeatMapFast()がimshowです.
どちらもsavefigと合わせると0.2秒以下ってイメージですね.
もう少し早くしたいなー.
※計測はtime.time()でやっているため,精度・分解能はあまりよくないらしい.