使用joblib.Parallel平行處理資料是出現TypeError : can’t pickle instancementhod objects 錯誤
首先是一段函數調用的實現:
import joblibimport numpy as npdef load_data(K, T): return K+Tjobs = 8Ts = np.repeat(np.array([1]), jobs, axis=0)Ks = np.repeat(np.array([1]), jobs, axis=0)with joblib.Parallel(n_jobs=jobs) as parallel: outpout = parallel(joblib.delayed(load_data)(k, s) for k, s in zip(Ks, Ts))print(output)
這段代碼是沒有問題的輸出 [5, 5, 5, 5, 5, 5, 5, 5]
但是如果在類中進行處理,如下所示:
import joblibimport numpy as npclass testParallel: def load_data(self, K, T): return K+T del run(self): jobs = 8 Ts = np.repeat(np.array([1]), jobs, axis=0) Ks = np.repeat(np.array([1]), jobs, axis=0) with joblib.Parallel(n_jobs=jobs) as parallel: outpout = parallel(joblib.delayed(load_data)(k, s) for k, s in zip(Ks, Ts))
這樣就會出現:TypeError : can’t pickle instancementhod objects錯誤。這種bug出現的方式是自己找出來的,最後在一篇部落格中看到,第一種方法為解決使用joblib和Multiprocessing基於pickling實現平行處理的方法,並且解釋了其出現的原因。
為了pickle一個object,object必須是一個全域的變數,這才才可以使unpickle通過(PS:pickle存取結構化的資料)。如果在類中,輸出的參數為以下類型:
[('self', 0), ('self', 1), ('self', 2), ('self', 3), ('self', 4), ('self', 5), ('self', 6), ('self', 7), ('self', 8), ('self', 9)]
因此需要在類外對函數進行定義。