前提
3次元空間上の点と点を結ぶベクトル場の可視化を行っていますが途中で処理が停止してしまいます.複数のデータがあるため,forループでデータ読み込みと画像作成をしています.
解像度が高く,位置関係がはっきりした画像が欲しいため,調べたところ,plotly.io.write_image()でsvgを作り,それをpngに変換する方法を採用しています(matplotlibでは上書きを重ねていくので前後関係がわからない).
発生している問題
エラーを吐くわけでは無いですが,ループを重ねると,処理が途中で進まなくなります.プログラムが強制終了するわけではありません.これの原因と対策を教えていただきたいです.
該当のソースコード
様々な処理もしているので,全体は割愛しています.下記のコードをforループで何回も実行しています.
画像とともに,データ点の情報もファイルに出力するようにしています.
python
1import plotly.io as pio 2import cairosvg 3def make_output(output_file,image_file,node_id,neighbor_id, 4 start_x,start_y,start_z,end_x,end_y,end_z, 5 node_color,node): 6 file=open(output_file,mode="w")#データ点の情報を入れるファイル 7 8 data=[] 9 10 for k in range(0,node): 11#読み込んだデータ点からベクトル場を作る. 12#一定の領域からはみ出した分については修正を加える. 13 xratio1=start_x[k]/sidex 14 yratio1=start_y[k]/sidey 15 zratio1=start_z[k]/sidez 16 x=start_x[k]-sidex*float(Decimal(str(xratio1)).quantize(Decimal('0'),rounding=ROUND_HALF_UP)) 17 y=start_y[k]-sidey*float(Decimal(str(yratio1)).quantize(Decimal('0'),rounding=ROUND_HALF_UP)) 18 z=start_z[k]-sidez*float(Decimal(str(zratio1)).quantize(Decimal('0'),rounding=ROUND_HALF_UP)) 19 xratio2=(end_x[k]-start_x[k])/sidex 20 yratio2=(end_y[k]-start_y[k])/sidey 21 zratio2=(end_z[k]-start_z[k])/sidez 22 dx=(end_x[k]-start_x[k])-sidex*float(Decimal(str(xratio2)).quantize(Decimal('0'),rounding=ROUND_HALF_UP)) 23 dy=(end_y[k]-start_y[k])-sidey*float(Decimal(str(yratio2)).quantize(Decimal('0'),rounding=ROUND_HALF_UP)) 24 dz=(end_z[k]-start_z[k])-sidez*float(Decimal(str(zratio2)).quantize(Decimal('0'),rounding=ROUND_HALF_UP)) 25 26 data.append(go.Scatter3d(x=[x,x+dx],y=[y,y+dy],z=[z,z+dz],mode='lines',\ 27 marker=dict(color=node_color[k],size=5,opacity=0.8))) 28 29 written_data=[node_id[k],neighbor_id[k],x,y,z,\ 30 dx,dy,dz] 31 for l in range(0,len(written_data)): 32 file.write("{:10s}".format(str(written_data[l]))) 33 file.write(" ") 34 file.write("\n") 35 36 file.close() 37 38 fig=dict(data=data,layout=layout) 39 40 pio.write_image(fig,image_file+".svg")#ループを重ねると,ここで停止. 41 42 input_fn = image_file+".svg" 43 output_fn = image_file+".png" 44 cairosvg.svg2png(url=input_fn, write_to=output_fn, scale=4.0) 45 46 return
試したこと
別のPCで上記を実行したところ,停止するループ数が異なったので,メモリリーク等を疑いましたが,メモリの使用量は限度に達していませんでした.tracemallocで見ても異常な使用量には至っていませんでした.
CPU稼働率は100%を超えることもありますが,停止後はほぼ稼働しなくなります.
matplotlibでは滞りなく描画できました.
あなたの回答
tips
プレビュー