1

pyodbc を使用して Excel シートから ms アクセスにデータを転送し、matplotlib を使用して Excel シートのデータの一部を使用してプロットを作成し、それらをフォルダーに保存する Python スクリプトを作成しました。スクリプトを実行すると、期待どおりの動作をしました。ただし、タスク マネージャーで監視していたところ、1500 MB を超える RAM を使用していました。

それがどのように可能かさえ理解していません。560 個の画像が作成されましたが、これらの画像の合計サイズはわずか 17 MB でした。Excel シートは 8.5 MB です。私のコードをすべて見ないと、問題が何であるかを正確に教えてくれないかもしれないことを理解しています(問題が正確にはわからないので、すべてを投稿する必要があり、それは合理的ではないと思います私のコード全体を読むように頼むことはできませんが、いくつかの一般的なガイドラインで十分です.

ありがとう。

アップデート

@HYRYが提案したとおりに実行し、コードを分割しました。最初に matplotlib 関数のみを使用してスクリプトを実行し、その後それらを使用せずにスクリプトを実行しました。これまでにコメントした人が推測したように、メモリの浪費は matplotlib 関数によるものです。絞り込んだので、コードの一部を投稿します。以下のコードは 2 つの for ループで実行されることに注意してください。内側の for ループは常に 4 回実行されますが、外側の for ループは何度でも実行されます。

#Plot waveform and then relative harmonic orders on a bar graph.
#Remember that table is the sheet name which is named after the ExperimentID
cursorEx.execute('select ['+phase+' Time] from ['+table+']')
Time = cursorEx.fetchall()                   
cursorEx.execute('select ['+phase+' Waveform] from ['+table+']')
Current = np.asanyarray(cursorEx.fetchall())                                                               
experiment = table[ :-1]                
plt.figure()
#A scale needs to be added to the primary current values
if line == 'P':
    ratioCurrent = Current / 62.5
    plt.plot(Time, ratioCurrent)
else:
    plt.plot(Time, Current)
plt.title(phaseTitle)
plt.xlabel('Time (s)')
plt.ylabel('Current (A)')
plt.savefig(os.getcwd()+'\\HarmonicsGraph\\'+line+'H'+experiment+'.png')

cursorEx.execute('select ['+phase+' Order] from ['+table+']')
cursorEx.fetchone() #the first row is zero
order = cursorEx.fetchmany(51)
cursorEx.execute('select ['+phase+' Harmonics] from ['+table+']')
cursorEx.fetchone()
percentage = np.asanyarray(cursorEx.fetchmany(51))

intOrder = np.arange(1, len(order) + 1, 1)  
plt.figure()                
plt.bar(intOrder, percentage, width = 0.35, color = 'g')                
plt.title(orderTitle)
plt.xlabel('Harmonic Order')
plt.ylabel('Percentage')
plt.axis([1, 51, 0, 100])
plt.savefig(os.getcwd()+'\\HarmonicsGraph\\'+line+'O'+experiment+'.png')
4

2 に答える 2

1

あなたのコードにはクリーンアップ部分が見当たりませんが、問題はあなたが呼び出していないことだと確信しています

plt.close()

各プロットを終了した後。各図を完成させた後にその 1 行を追加し、それが役立つかどうかを確認してください。

于 2013-06-13T19:24:50.373 に答える