ディレクトリ内のファイルを監視し、ファイルに変更があるたびに電子メールを送信するデーモンを作成しました。bb-freeze を使用して Windows .exe にコンパイルしました。数日間実行した後、メモリ内のスペースがますます多くなっていることに気付きました。
Heapyを使用して (コンパイルされた .exe ではなく) .py ファイルのメモリ使用量を監視したところ、関数を呼び出すたびに、オブジェクトの数が 3 ずつ増加し、対応するメモリ使用量が 484 バイト増加することがわかりました。smtplib モジュールを使用しており、どこでリークが発生しているのかわかりません。
from guppy import hpy
import time
import gc
import os
import smtplib
import mimetypes
from email.MIMEMultipart import MIMEMultipart
from email.MIMEBase import MIMEBase
from email.MIMEText import MIMEText
from email.MIMEAudio import MIMEAudio
from email.MIMEImage import MIMEImage
from email.Encoders import encode_base64
def sendMail(subject, text, to='blah@gmail.com', username='more.blah@gmail.com', password='blah', smtpServer='smtp.gmail.com', smtpPort=587):
gmailUser = username
gmailPass = password
recipient = to
msg = MIMEMultipart()
msg['From'] = gmailUser
msg['To'] = recipient
msg['Subject'] = subject
msg.attach(MIMEText(text))
mailServer = smtplib.SMTP(smtpServer, smtpPort)
mailServer.ehlo()
mailServer.starttls()
mailServer.ehlo()
mailServer.login(gmailUser, gmailPass)
mailServer.sendmail(gmailUser, recipient, msg.as_string())
mailServer.quit()
print('Sent email to "%s"' % recipient)
if __name__=='__main__':
while True:
sendMail("Function", "Blah!")
gc.collect()
print hpy().heap()
time.sleep(10)
インターネットのどこかでこのコードを見て、それをコピーしました。動作しますが、メモリ リークが発生します。誰かがメモリリークが発生している場所を見つけるのを手伝ってもらえますか?? :(
編集: msg.as_string() の使用がメモリ リークの原因のようです。msg="Blah" などのプレーン テキストを msg.as_string() の代わりに使用すると、問題が修正されます。しかし、それでは件名を追加できません。