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
別のところがボトルネックか。↑程度の量を出力するためにどこに時間がかかってるんだろう。
わかった。以下かもしれない。これは長くて仕方が無い。メッセージが悪い
結論。問題無さそうなので、メッセージは無視