2017-05-03 92 views
0

這是一個將成功序列化爲dill的片段,但是會以pickle失敗。令人驚訝的是Tensor對象不是本機可醃的。這是線程感知張量的根本限制,還是僅僅是沒有實現?酸洗tensorflow張量爲什麼會失敗?

import dill 
import pickle 
import tensorflow as tf 

dill.dumps(tf.zeros((1,1))) 
print("Dill succeeded") 
pickle.dumps(tf.zeros((1,1))) 
print("Pickle succeeded") 

輸出:

$ python foo.py 
Dill succeeded 
Traceback (most recent call last): 
    File "foo.py", line 7, in <module> 
    pickle.dumps(tf.zeros((1,1))) 
TypeError: can't pickle _thread.lock objects 
+0

可能的重複http://stackoverflow.com/questions/39286665/how-to-avoid-pickling-errors-when-sharing-objects-between-threads – DyZ

回答

2

答案很簡單:pickle不能序列在python大多數對象,該對象thread.lock包括。如果要序列化其中一個對象,請使用高級序列化庫,如dill。至於爲什麼pickle不能,我認爲最初它源於GIL的實現和使對象呈現不可序列化的對象,因此沒有驅動程序序列化語言中的所有內容。關於所有python對象的序列化引發的安全問題一直存在,但我認爲這是一個紅鯡魚。沒有完整的語言序列化限制了並行計算操作的能力,因此希望pickle將從dill中學習如何序列化更多的對象。