1
1

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?

More than 3 years have passed since last update.

PythonのMatplotlib+Seabornを使ったグラフ描画を非Python実行環境のWindowsでプロセス間通信で使う

Posted at

以前の記事で,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()でやっているため,精度・分解能はあまりよくないらしい.

1
1
0

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
1
1

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?