2017-05-03 7 views
0

dillでシリアル化に成功するスニペットですが、pickleで失敗します。 Tensorのオブジェクトがネイティブにpickleableでないことは驚くべきことです。これはスレッド対応のテンソルの基本的な制限ですか、それとも実装されていないのですか?酸洗いテンソルフローテンソルが失敗するのはなぜですか?

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オブジェクトが含まれています。これらのオブジェクトの1つをシリアル化する場合は、dillのような高度なシリアル化ライブラリを使用します。正確にはなぜpickleができないのかについては、もともとはGILとframeオブジェクトの実装に由来していて、いくつかのオブジェクトを直列化できないため、すべての言語を直列化するドライブがありませんでした。すべてのPythonオブジェクトのシリアライゼーションに起因するセキュリティ問題については、常に話がありましたが、私はそれが赤ちゃんだと思います。完全な言語のシリアル化が並列コンピューティングで動作する能力を制限しているわけではないので、うまくいけばpickledillからもっと多くのオブジェクトをシリアライズする方法を学ぶでしょう。

関連する問題