Python 打开的文件太多 - fbprohet

问题描述

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

解决方法

暂无找到可以解决该程序问题的有效方法,小编努力寻找整理中!

如果你已经找到好的解决方法,欢迎将解决方案带上本链接一起发送给小编。

小编邮箱:dio#foxmail.com (将#修改为@)