1

我正在做一个项目,我用 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洛伦兹

4

0 回答 0