1

マップされたネットワークドライブで利用できる大きな(〜75MB)ピクルスオブジェクトがあります(例:X:/folder1/large_pickled_item.pk)オブジェクトにはnumpy配列+ pythonリストが含まれており、cPickle、プロトコル2を使用してピクルス化されています

データの選択を解除しようとすると、次のエラーメッセージが表示されます。

ピクルスの使用:KeyError :(ランダムな文字)

cPickleの使用:IOError:[Errno22]無効な引数

ピクルス化されたオブジェクトのサイズが小さい場合、または(大きい)オブジェクトをローカルドライブにコピーして同じスクリプトを実行しても、エラーは発生しません。

問題がどこにあるのか考えていますか?Python + Pickleの問題ですか、それともWindows共有の問題ですか?

ノート:

  1. Windows XP Professional(SP3)でPython2.7.2を使用しています
  2. 私はオブジェクトのフォーマットを制御できません、私はそれらを作成しません、私はそれらを読むことしかできません
  3. スタックトレースの例:

    ファイル"test.py"、行38、getObject obj = pickle.load(input)ファイル "C:\ software \ python \ lib \ pickle.py"、行1378、ロードreturn Unpickler(file).load()ファイル"C:\ software \ python \ lib \ pickle.py"、行858、ロードディスパッチキーKeyError:'〜'

解決

  1. 67076095バイトのチャンクでファイルを文字列バッファに読み込みます。
  2. ファイルオブジェクトでpickle.loadを呼び出す代わりに、文字列バッファでpickle.loadsを呼び出します。
4

1 に答える 1

1

これはWindowsのバグが原因で、64MBを超えるチャンクでのネットワークファイルの読み取りと書き込みが機能しません。

https://stackoverflow.com/a/4228291/367273に示されている回避策のミラーイメージを試すことをお勧めします

それでも問題が解決しない場合は、ファイルオブジェクトのラッパーを作成して、すべての大きなread()読み取りを複数の小さな読み取りに自動的に分割し、そのラッパーをpickleモジュールに提示できますか?

于 2012-05-02T11:01:54.773 に答える