我们的代码中有一个大熊猫数据框-形状为(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个小时。
答案 0 :(得分:1)
您可以在子流程中创建大型数据框,但仅将所需的内容发送给父级,然后使用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)