我有几个运行在服务器上的脚本,这些脚本可以对各种字典进行酸洗和解酸。它们都使用相同的酸洗基本代码,如下所示:
SellerDict=open('/home/hostadl/SellerDictkm','rb')
SellerDictionarykm=pickle.load(SellerDict)
SellerDict.close()
SellerDict=open('/home/hostadl/SellerDictkm','wb')
pickle.dump(SellerDictionarykm,SellerDict)
SellerDict.close()除了其中一个之外,所有的脚本都运行得很好。有问题的人会访问各种网站,抓取数据并将其存储在字典中。这段代码会运行一整天的酸洗和非酸洗字典,直到午夜才停止。第二天早上,cronjob再次启动它。这个脚本可以运行几个星期而没有问题,但是大约每个月一次,当它试图打开一个字典时,脚本会因为EOFError而死。字典的大小通常约为80MB。我甚至尝试在酸洗数据时在SellerDict.close()之前添加SellerDict.flush(),以确保傍晚被刷新。
你知道是什么导致了这一切吗?Python非常可靠,所以我不认为这是由于文件的大小造成的。代码在死前很长一段时间都运行得很好,这让我相信可能是字典中保存了一些导致这个问题的东西,但我不知道。
此外,如果你知道保存字典的更好的方法,而不是泡菜,我愿意选择。就像我之前说的,字典不断地被打开和关闭。为了澄清,只有一个程序将使用相同的字典,所以问题不是由几个程序试图访问相同的字典引起的。
更新:
这是我从一个日志文件中得到的回溯。
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发布于 2013-01-08 14:24:55
所以这实际上是一个内存问题。当计算机内存耗尽并尝试解选或加载数据时,该过程将无法声明此EOFError。我增加了计算机上的RAM,这再也不是问题了。
感谢所有的评论和帮助。
发布于 2012-04-22 06:48:00
以下是不使用锁定时会发生的情况:
import pickle
# define initial dict
orig_dict={'foo':'one'}
# write dict to file
writedict_file=open('./mydict','wb')
pickle.dump(orig_dict,writedict_file)
writedict_file.close()
# read the dict from file
readdict_file=open('./mydict','rb')
mydict=pickle.load(readdict_file)
readdict_file.close()
# now we have new data to save
new_dict={'foo':'one','bar':'two'}
writedict_file=open('./mydict','wb')
#pickle.dump(orig_dict,writedict_file)
#writedict_file.close()
# but...whoops! before we could save the data
# some other reader tried opening the file
# now they are having a problem
readdict_file=open('./mydict','rb')
mydict=pickle.load(readdict_file) # errors out here
readdict_file.close()下面是输出:
python pickletest.py
Traceback (most recent call last):
File "pickletest.py", line 26, in <module>
mydict=pickle.load(readdict_file) # errors out here
File "/usr/lib/python2.6/pickle.py", line 1370, in load
return Unpickler(file).load()
File "/usr/lib/python2.6/pickle.py", line 858, in load
dispatch[key](self)
File "/usr/lib/python2.6/pickle.py", line 880, in load_eof
raise EOFError
EOFError最终,一些读取进程将尝试读取该pickled文件,而另一个写入进程已将其打开以进行写入。在尝试读取文件之前,您需要确保您有某种方法来判断另一个进程是否已经打开了一个要写入的文件。
要获得一个非常简单的解决方案,请看一下this thread that discusses using Filelock。
https://stackoverflow.com/questions/10263564
复制相似问题