[英]How to speed up del
我們的代碼中有一個龐大的熊貓數據框 - 形狀是 (102730344, 50)。 為了釋放內存,我們在不再需要這個數據幀時放入一個 del。 該 del 語句目前在強大的硬件上運行需要 4 個小時。 有沒有辦法加快這個速度?
這是代碼流程:
big_data_df, small_df, medium_data, smaller_df = get_data(params)
#commented out code
del big_data_df # this takes 4 hours
所以我們調用一個函數,返回4個數據幀,其中一個是我們以后要刪除的大數據幀。 我們已經注釋掉了在不再需要測試時獲取數據幀和刪除它之間的代碼。 然后 del 運行,執行后的日志語句顯示運行時間為 4 小時。
您可以在子進程中創建大型數據幀,但只將您想要的內容發送給父os_exit()
,然后使用os_exit()
跳過單個對象清理。 這是否適合您取決於返回數據的相對大小。 在您的情況下,SQL 和數據幀的創建/處理可能會在子流程中完成。 在這個例子中,我將結果發送到stdout
,但保存到臨時文件也是合理的。 我正在使用泡菜,但其他序列化程序(例如 pyarrow)可能會更快。
....它可能在你的情況下根本不起作用。
dfuser.py
import sys
import subprocess as subp
import pandas as pd
try:
proc = subp.Popen([sys.executable, 'dfprocessor.py'], stdin=subp.PIPE, stdout=subp.PIPE, stderr=None)
df = pd.read_pickle(proc.stdout, compression=None)
print("got df")
proc.stdin.write(b"thanks\n")
proc.stdin.close()
proc.wait()
print(df)
finally:
print('parent done')
dfcreator.py
import pandas as pd
import sys
import os
try:
# add your df creation and processing here
df = pd.util.testing.makeDataFrame()
small_df = df # your processing makes it smaller
# send
small_df.to_pickle(sys.stdout.buffer, compression=None)
sys.stdout.close()
# make sure received
sys.stdin.read(1)
finally:
# exit without deleting df to save time
sys.stderr.write("out of here\n")
os._exit(0)
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.