サーバー上で、さまざまな辞書をピクルおよびアンピクルするスクリプトをいくつか実行しています。以下に示すように、それらはすべて酸洗に同じ基本コードを使用します。
SellerDict=open('/home/hostadl/SellerDictkm','rb')
SellerDictionarykm=pickle.load(SellerDict)
SellerDict.close()
SellerDict=open('/home/hostadl/SellerDictkm','wb')
pickle.dump(SellerDictionarykm,SellerDict)
SellerDict.close()
スクリプトの 1 つを除いて、すべてのスクリプトが正常に実行されます。問題のあるものは、さまざまな Web サイトにアクセスしてデータをスクレイピングし、辞書に格納します。このコードは、一日中酸洗い辞書と解凍辞書を実行し、真夜中に停止します。cronjob は、翌朝に再び開始します。このスクリプトは問題なく数週間実行できますが、月に約 1 回、辞書を開こうとしたときに EOFError が原因でスクリプトが停止します。辞書のサイズは通常約 80 MB です。夜がフラッシュされていることを確認するためにデータをピクルするときに、SellerDict.close()の前にSellerDict.flush()を追加しようとさえしました。
これを引き起こしている可能性のあるアイデアはありますか?Python はかなりしっかりしているので、ファイルのサイズが原因ではないと思います。コードが死ぬ前に長い間正常に実行される場合、この問題の原因となっている辞書に何かが保存されている可能性があると思われますが、私にはわかりません。
また、ピクル以外の辞書を保存するためのより良い方法を知っている場合は、オプションを用意しています. 先ほど言ったように、辞書は常に開いたり閉じたりしています。明確にするために、同じ辞書を使用するのは 1 つのプログラムのみであるため、複数のプログラムが同じ辞書にアクセスしようとしても問題は発生しません。
アップデート:
ログファイルから取得したトレースバックを次に示します。
Traceback (most recent call last):
File "/home/hostadl/CompileRecentPosts.py", line 782, in <module>
main()
File "/home/hostadl/CompileRecentPosts.py", line 585, in main
SellerDictionarykm=pickle.load(SellerDict)
EOFError