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