我已将此报告为大熊猫问题.与此同时,我发布此处希望节省其他时间,以防他们遇到类似的问题.
在分析需要优化的进程时,我发现重命名列不在适当位置可以提高x120的性能(执行时间).分析表明这与垃圾收集有关(见下文).
此外,通过避免使用dropna方法来恢复预期的性能.
以下简短示例演示了因子x12:
import pandas as pd
import numpy as np
Run Code Online (Sandbox Code Playgroud)
%%timeit
np.random.seed(0)
r,c = (7,3)
t = np.random.rand(r)
df1 = pd.DataFrame(np.random.rand(r,c), columns=range(c), index=t)
indx = np.random.choice(range(r),r/3, replace=False)
t[indx] = np.random.rand(len(indx))
df2 = pd.DataFrame(np.random.rand(r,c), columns=range(c), index=t)
df = (df1-df2).dropna()
## inplace rename:
df.rename(columns={col:'d{}'.format(col) for col in df.columns}, inplace=True)
Run Code Online (Sandbox Code Playgroud)
100个循环,最佳3:每循环15.6毫秒
第一输出线%%prun
:
ncalls tottime percall cumtime percall filename:lineno(function)
Run Code Online (Sandbox Code Playgroud)1 0.018 0.018 0.018 0.018 {gc.collect}
%%timeit
np.random.seed(0)
r,c = (7,3)
t = np.random.rand(r)
df1 = pd.DataFrame(np.random.rand(r,c), …
Run Code Online (Sandbox Code Playgroud) 循环加载 npz 文件会导致内存溢出(取决于文件列表长度)。
以下似乎都没有帮助
删除将数据存储在文件中的变量。
使用 mmap。
调用 gc.collect() (垃圾收集)。
以下代码应重现该现象:
import numpy as np
# generate a file for the demo
X = np.random.randn(1000,1000)
np.savez('tmp.npz',X=X)
# here come the overflow:
for i in xrange(1000000):
data = np.load('tmp.npz')
data.close() # avoid the "too many files are open" error
Run Code Online (Sandbox Code Playgroud)
在我的实际应用程序中,循环结束了一个文件列表,溢出超过了 24GB 的 RAM!请注意,这是在 ubuntu 11.10 以及 numpy v 1.5.1 和 1.6.0 上尝试过的
我已经在numpy 票证 2048 中提交了一份报告,但这可能引起更广泛的兴趣,因此我也将其发布在这里(此外,我不确定这是一个错误,但可能是我的错误编程造成的)。
命令
del data.f
Run Code Online (Sandbox Code Playgroud)
应该在命令之前
data.close()
Run Code Online (Sandbox Code Playgroud)
有关更多信息和找到解决方案的方法,请阅读下面 HYRY 的友好回答