見出し画像

joblib.Memory.cacheでPersisting input arguments tookが出る場合の対処法


起きたこと

joblib.Memory.cacheでpandas.DataFrameを引数に持つ関数をmemoizationしたら、呼び出し時にPersisting input arguments tookが出た。


原因

pandas.DataFrameのreprが長い。joblibはreprを必ず呼び出す。


対処法

joblibを書き換えるかreprを書き換えるか。以下のオプションでpandasのreprを短くした。

これで治らなかった。

_info_reprで、display.large_reprがinfoでかつ、収まりきらないときはinfoで済ませるらしい。

以下でも治らない。どこに時間かかってるんだろう。

def new_repr(self):
   return 'pd.DataFrame custom repr'
pd.DataFrame.__repr__ = new_repr

よく見たら引数にIndexが入ってた。キャッシュのディレクトリに入っている。

{"duration": 3.539868116378784, "input_args": {"algo": "'pretrain'", "df": "pd.DataFrame custom repr", "features": "Index(['feature_intelligence1', 'feature_intelligence2',\n       'feature_intelligence3', 'feature_intelligence4',\n       'feature_intelligence5', 'feature_intelligence6',\n       'feature_intelligence7', 'feature_intelligence8',\n       'feature_intelligence9', 'feature_intelligence10',\n       ...\n       'feature_wisdom37', 'feature_wisdom38', 'feature_wisdom39',\n       'feature_wisdom40', 'feature_wisdom41', 'feature_wisdom42',\n       'feature_wisdom43', 'feature_wisdom44', 'feature_wisdom45',\n       'feature_wisdom46'],\n      dtype='object', length=310)", "parameters": "{'test_data_ratio': 0.3, 'cv_folds': 5, 'select_cv_folds': 5, 'refit': False, 'select_refit': False, 'parallel_cv': False, 'models': {'ridge': {'scaler': ['standard']}}, 'sample_weight': ['pretrain'], 'sample_weight_pretrain_min_weight': {'min': 0, 'max': 0.5}, 'score': 'numerai_corr_p_mean', 'score_numerai_corr_p_mean': {'n': 40}, 'optuna_n_trials': 1, 'cv_metric_prefix': 'cv_', 'test_metric_prefix': 'test_'}"}}

以下でも治らない。かかる時間も変わっていないっぽい。

def new_repr(self):
   return 'pd.DataFrame custom repr'
pd.DataFrame.__repr__ = new_repr
pd.Index.__repr__ = new_repr
pd.Series.__repr__ = new_repr

別のところがボトルネックか。↑程度の量を出力するためにどこに時間がかかってるんだろう。

わかった。以下かもしれない。これは長くて仕方が無い。メッセージが悪い

結論。問題無さそうなので、メッセージは無視