2 回答

TA貢獻1783條經驗 獲得超4個贊
嘗試將“ for
”循環替換為從 1 到 Items.Count 的循環(使用 Items(i) 檢索項目) - 不確定 Python,但在其他語言中,“ ”foreach
循環傾向于保留引用的集合的所有項目,直到循環退出。

TA貢獻1802條經驗 獲得超5個贊
我的解決方案是不將所有電子郵件(MailItem 對象)存儲在列表中。如果我需要列表中的電子郵件,當我處理電子郵件時,我應該list.pop()立即將其從列表中刪除。使用PropertyAccessor并將電子郵件保留在列表中會導致 Outlook 將對象保留在內存中,并導致 Outlook 內存不足。
我擺脫了get_emails和get_emails_and_ids函數并重新編寫了該get_email_ids函數以僅存儲電子郵件消息 ID,但不將電子郵件對象存儲在列表中:
def get_email_ids(folder) -> Tuple[Set[str], int]:
email_ids = set()
items = folder.Items
i = 0
for item in items:
if "_MailItem" in str(type(item)):
i += 1
property_accessor = item.PropertyAccessor
email_id = property_accessor.GetProperty(PidTagInternetMessageId)
if len(email_id) > 0:
email_ids.add(email_id)
if i % 500 == 0:
print(f" Retrieved {i} email IDs.")
return email_ids, i
我編寫的另一個腳本現在快了很多,至少需要 10 分鐘。以前,它每秒處理幾封電子郵件,需要幾個小時。
添加回答
舉報