我正在做一个项目,我用 fbprophet 计算多个模型。Fbprohet 有一个问题,即没有默认的方式来抑制 pystan 的消息。所以在github上提到了一个解决方法来使用它作为装饰器:
class suppress_stdout_stderr(object):
def __init__(self):
# Open a pair of null files
self.null_fds = [os.open(os.devnull, os.O_RDWR) for x in range(2)]
# Save the actual stdout (1) and stderr (2) file descriptors.
self.save_fds = (os.dup(1), os.dup(2))
def __enter__(self):
# Assign the null pointers to stdout and stderr.
os.dup2(self.null_fds[0], 1)
os.dup2(self.null_fds[1], 2)
def __exit__(self, *_):
# Re-assign the real stdout/stderr back to (1) and (2)
os.dup2(self.save_fds[0], 1)
os.dup2(self.save_fds[1], 2)
# Close the null files
os.close(self.null_fds[0])
os.close(self.null_fds[1])
我使用该命令计算模型:
with suppress_stdout_stderr():
m = Prophet()
m.fit(history)
我为每个模型做大约 250 次,并且有大约 600 个单个模型。因此Prophet()
将被调用大约 150.000 次:
class Model:
def __init__(stockticker):
self.ticker = stockticker
self.data = pd.read_excel(f'{self.ticker}.xlsx')
def get_residuals(my_stock_resid_distr_fitting):
for i in range(len(my_stock_resid_distr_fitting)):
with suppress_stdout_stderr():
m = Prophet()
m.fit(history)
def main():
self.get_residuals(200)
tickers = ['AAPL',....]
for ticker in tickers:
m = model(ticker)
m.main()
- 股票报价单大约600
大约 1024 次迭代后,脚本停止运行并显示该错误代码:
OSError: [Errno 24] Too many open files
因此,当我正确理解装饰器时,它会打开空文件来替换 pystan 警告。在我看来,装饰器关闭了函数中的空文件def __exit__(self, *_):
。但这似乎无法正常工作。
有人看到错误或有其他解决方案吗?
如果不是,我会增加我的 ubuntu 服务器上的最大打开文件数,但我希望你有一个更 Pythonic 的方式。
BR洛伦兹