質問をすることでしか得られない、回答やアドバイスがある。

15分調べてもわからないことは、質問しよう!

新規登録して質問してみよう
ただいま回答率
85.35%
Python

Pythonは、コードの読みやすさが特徴的なプログラミング言語の1つです。 強い型付け、動的型付けに対応しており、後方互換性がないバージョン2系とバージョン3系が使用されています。 商用製品の開発にも無料で使用でき、OSだけでなく仮想環境にも対応。Unicodeによる文字列操作をサポートしているため、日本語処理も標準で可能です。

Q&A

0回答

1837閲覧

[Python]画像作成のループ中で処理が止まる

Rosh

総合スコア0

Python

Pythonは、コードの読みやすさが特徴的なプログラミング言語の1つです。 強い型付け、動的型付けに対応しており、後方互換性がないバージョン2系とバージョン3系が使用されています。 商用製品の開発にも無料で使用でき、OSだけでなく仮想環境にも対応。Unicodeによる文字列操作をサポートしているため、日本語処理も標準で可能です。

0グッド

0クリップ

投稿2020/10/15 10:42

編集2020/10/16 11:00

前提

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では滞りなく描画できました.

気になる質問をクリップする

クリップした質問は、後からいつでもMYページで確認できます。

またクリップした質問に回答があった際、通知やメールを受け取ることができます。

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

guest

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

まだ回答がついていません

会員登録して回答してみよう

アカウントをお持ちの方は

15分調べてもわからないことは
teratailで質問しよう!

ただいまの回答率
85.35%

質問をまとめることで
思考を整理して素早く解決

テンプレート機能で
簡単に質問をまとめる

質問する

関連した質問