2016-05-10 1 views
0

私の生産環境以外では再生できない非常に奇妙なエラーがあります。このエラーは何を意味しますか?Dill/Pickling Error:奇数個の設定項目

serialized_object = dills.dumps(object) 
    dill.loads(serialized_object) 

pickle.UnpicklingError:設定項目の項目数が奇数

答えて

1

私は前にこれを見たことがなかったので、私はソースコードを見て、私は次のコードを実行しようとしたとき、私はそれを得ます。ここを参照してください:https://github.com/python/cpython/blob/f24143b25e4f83368ff6182bebe14f885073015c/Modules/_pickle.c#L5914それはあなたが破損しているか敵対的なピクルスを持っていることを意味するようです。

OPのコメントに基づいて、私は回避策を見ると思います。私は、回避策の影響を判断する必要があります、それはdillに統合する必要がありますが、今ここにのためにある:

>>> import StringIO as io 
>>> f = io.StringIO() 
>>> import dill 
>>> import numpy as np 
>>> x = np.array([1]) 
>>> y = (x,) 
>>> p = dill.Pickler(f) 
>>> p.dump(x) 
>>> f.getvalue() 
"cnumpy.core.multiarray\n_reconstruct\np0\n(cnumpy\nndarray\np1\n(I0\ntp2\nS'b'\np3\ntp4\nRp5\n(I1\n(I1\ntp6\ncnumpy\ndtype\np7\n(S'i8'\np8\nI0\nI1\ntp9\nRp10\n(I3\nS'<'\np11\nNNNI-1\nI-1\nI0\ntp12\nbI00\nS'\\x01\\x00\\x00\\x00\\x00\\x00\\x00\\x00'\np13\ntp14\nb." 
>>> p.dump(y) 
>>> f.getvalue() 
"cnumpy.core.multiarray\n_reconstruct\np0\n(cnumpy\nndarray\np1\n(I0\ntp2\nS'b'\np3\ntp4\nRp5\n(I1\n(I1\ntp6\ncnumpy\ndtype\np7\n(S'i8'\np8\nI0\nI1\ntp9\nRp10\n(I3\nS'<'\np11\nNNNI-1\nI-1\nI0\ntp12\nbI00\nS'\\x01\\x00\\x00\\x00\\x00\\x00\\x00\\x00'\np13\ntp14\nb.(g5\ntp15\n." 
>>> dill.loads(_) 
array([1]) 
>>> 
+0

これは、ディールのバグが原因であることが判明しました。以下の返信を – btomtom5

0
import dill 
import numpy as np 

x = np.array([1]) 

y = (x,) 

dill.dumps(x) 

dill.loads(dill.dumps(y)) 

これは、インデックス例外のうちをスローします。理由は、numpy配列オブジェクトを直列化するために登録されている特別な関数があるからです。この特殊関数は、グローバルPicklerを使用して、引数として渡されるPicklerではなくシリアル化されたデータを格納します。それを修正するために、代わりに引数に渡されるPicklerを使用しました。私はそれがディルの他の何かを壊すかどうかわからない。

+0

で探してください。あなたがやったことを思い出したり、githubの問題に投稿したりできますか?それが 'dill'のバグに起因していて回避策がある場合は、パッチの影響をテストできます。 –

+0

私はあなたが言ったことを見ていると思います...あなたは 'dill.dumps'の代わりに' dill.Pickler.dumps'を使用しました。あれは正しいですか?それは完璧に優れたアプローチであり、知っておくと良いことです。 'numpy'配列を扱う' Pickler'メソッドにパッチを追加したいのですが、上記を確認できますか? –

+0

https://github.com/uqfoundation/dill/blob/master/dill/dill.py#L245 ここはこのコード行です。可変ピックはピックラーの代わりに使用されます – btomtom5

関連する問題