首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >Python酸洗字典EOFError

Python酸洗字典EOFError
EN

Stack Overflow用户
提问于 2012-04-22 06:26:48
回答 2查看 14.8K关注 0票数 5

我有几个运行在服务器上的脚本,这些脚本可以对各种字典进行酸洗和解酸。它们都使用相同的酸洗基本代码,如下所示:

代码语言:javascript
复制
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非常可靠,所以我不认为这是由于文件的大小造成的。代码在死前很长一段时间都运行得很好,这让我相信可能是字典中保存了一些导致这个问题的东西,但我不知道。

此外,如果你知道保存字典的更好的方法,而不是泡菜,我愿意选择。就像我之前说的,字典不断地被打开和关闭。为了澄清,只有一个程序将使用相同的字典,所以问题不是由几个程序试图访问相同的字典引起的。

更新:

这是我从一个日志文件中得到的回溯。

代码语言:javascript
复制
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
EN

回答 2

Stack Overflow用户

发布于 2013-01-08 14:24:55

所以这实际上是一个内存问题。当计算机内存耗尽并尝试解选或加载数据时,该过程将无法声明此EOFError。我增加了计算机上的RAM,这再也不是问题了。

感谢所有的评论和帮助。

票数 10
EN

Stack Overflow用户

发布于 2012-04-22 06:48:00

以下是不使用锁定时会发生的情况:

代码语言:javascript
复制
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()

下面是输出:

代码语言:javascript
复制
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

票数 3
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/10263564

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档