我有一些数据存储在我想要处理的数据库中.数据库访问非常缓慢,因此我决定在进行任何处理之前将所有数据加载到字典中.但是,由于存储的数据量巨大,我得到了一个内存不足的错误(我看到使用了超过2个演出).所以我决定使用磁盘数据结构,并发现使用shelve是一种选择.这是我做的(伪python代码)
def loadData():
if (#dict exists on disk):
d = shelve.open(name)
return d
else:
d = shelve.open(name, writeback=True)
#access DB and write data to dict
# d[key] = value
# or for mutable values
# oldValue = d[key]
# newValue = f(oldValue)
# d[key] = newValue
d.close()
d = shelve.open(name, writeback=True)
return d
Run Code Online (Sandbox Code Playgroud)
我有一些问题,
1)我真的需要writeBack = True吗?它有什么作用?
2)我仍然得到一个OutofMemory异常,因为我没有对数据写入磁盘的时间进行任何控制.我怎么做?我尝试每隔几次迭代执行一次sync(),但这也无济于事.
谢谢!
我正试图将我爬进的一些网站放入货架,但货架不会接受任何网站对象.它会接受列表,字符串,元组,你有什么,但是当我放入Site-object时,它会在我试图获取搁架的内容时崩溃
所以,当我这样填满我的货架时:
def add_to_shelve(self, site):
db = shelve.open("database")
print site, site.url
for word in site.content:
db[word] = site.url #site.url is a string, word has to be one too
Run Code Online (Sandbox Code Playgroud)
shelve.open("database")['whatever'] 工作得很好.
但如果我这样做:
def add_to_shelve(self, site):
db = shelve.open("database")
print site, site.url
for word in site.content:
db[word] = site #site is now an object of Site
Run Code Online (Sandbox Code Playgroud)
shelve.open("database")['whatever'] 出现此错误消息时出错:
AttributeError: 'module' object has no attribute 'Site'
Run Code Online (Sandbox Code Playgroud)
我完全被难倒了,奇怪的是,pythondocs也没有多少信息.他们所说的只是搁架中的钥匙必须是一个字符串,但价值或数据可以是"任意对象"
我是Python的新手,通过O'Reilly"学习Python"系列学习.我被困在一个搁置的例子,无法弄清楚为什么程序不起作用.我正在尝试构建一些示例数据,然后将其加载到搁置文件中.奇怪的是,当我在IDLE shell中键入它时它会起作用,但是当我将它键入.py文件并尝试运行它时它就不行.这是我的代码:
from Python_Learning.person import Person, Manager
bob = Person('Bob Smith', 'dev', 60000)
sue = Person('Sue Jones', job = 'designer', pay = 100000)
tom = Manager('Tom Jones', 1000000)
import shelve
db = shelve.open('persondb')
for object in (bob, sue, tom):
db[object.name] = object
db.close()
Run Code Online (Sandbox Code Playgroud)
同样,当我在IDLE shell上运行此代码时,我没有问题,但是当我从.py文件运行时,我收到以下错误:
回溯(最近一次调用最后一次):文件"Documents/Python_Learning/shelve.py",第7行,导入搁置文件"Documents/Python_Learning/shelve.py",第9行,db = shelve.open('persondb') AttributeError:'module'对象没有属性'open'
如果它有帮助,这里是关于我在Snow Leopard上运行的Python版本的信息:
在darwin上的Python 3.1.1(r311:74543,2009年8月24日,18:44:04)[GCC 4.0.1(Apple Inc. build 5493)]
感谢您对新手的帮助!
将
我刚刚碰到了一个完全奇怪的错误.我将选择的东西保存到一个文件中.其中一个是名为Tracker的类的版本,此副本称为跟踪器.
file = shelve.open(worldname, 'n')
file['Terramap'] = terramap
file['Satmap'] = satmap
file['Gasmap'] = gasmap
file['Planetset'] = planetset
file['World'] = minimap
file['Picture'] = picturemap
file['Worlddata'] = worlddata
file['Dimension'] = dimension
print "check", len(tracker.families)
file['Tracker'] = tracker
file['Schedule'] = schedule
file['Time'] = time
file.close()
Run Code Online (Sandbox Code Playgroud)
如果我在文件之前从跟踪器上打印了一些东西,纯粹是为了测试该跟踪器仍然存在,它确实可以检测到跟踪器.但后来单行,它出现了:
File "C:\Users\Mark\Desktop\Ultima Ratio Regum\URR0-2-1.py", line 17522, in world_menu
file['Tracker'] = tracker
File "C:\Python27\lib\shelve.py", line 132, in __setitem__
p.dump(value)
TypeError: expected string or Unicode object, NoneType found
Run Code Online (Sandbox Code Playgroud)
我只是......难过.这从来没有发生过,我也看不出这是怎么回事!任何人都可以对此有所了解吗?我一直在做的就是今天向追踪器添加一些东西,但是追踪器只存储了几千个字符串列表,但就是这样.但是,如果我在保存开始之前创建了一个新的跟踪器,它会保存得很好.
编辑:
运行pickle.dumps(跟踪器)显示:
File "C:\Users\Mark\Desktop\Ultima Ratio Regum\29-12-test.py", line 17515, in world_menu …Run Code Online (Sandbox Code Playgroud) if savescores == "y":
name = raw_input("Enter your name.")
datfile = filename[0:-4] + ".dat"
highscores = shelve.open(datfile)
try:
highscores[name].append(score)
except:
highscores[name] = [score]
Run Code Online (Sandbox Code Playgroud)
如果这个特定的玩家已经有分数,我想将新分数附加到他已经拥有的分数上,但显然这不起作用,因为它根本不会改变他的分数.
我正在使用Python中的Shelve,我遇到了一个问题:
In [391]: x
Out[391]: {'broken': {'position': 25, 'page': 1, 'letter': 'a'}}
In [392]: x['broken'].update({'page':1,'position':25,'letter':'b'})
In [393]: x
Out[393]: {'broken': {'position': 25, 'page': 1, 'letter': 'a'}}
Run Code Online (Sandbox Code Playgroud)
我不明白为什么不更新?有什么想法吗?
我有一些旧的搁置文件在长期待定的Perforce变更列表中,我可能永远不会提交.我想摆脱那些变更列表,因为它们污染了我的空间,但我不想失去一切,以防万一我需要那些,所以我需要备份.
有没有办法将搁置文件从更改列表移动到文件系统的某个位置?
将搁置的文件从P4V拖放到Windows资源管理器不起作用.命令行工具p4 unshelve似乎没有这样的选项.我还想避免在备份文件之前先取消文件,因为如果这些文件已经通过编辑检出,这将意味着额外的麻烦.
编辑
阅读答案让我意识到我真正想要的是保持这种变更列表安全,但远离视图(即远离我的常规工作空间).我不在乎它是在我的文件系统上还是在其他地方.所以我的问题实际上是:
有没有办法将搁置的文件从工作区移开备份?
我已经通过Intellij Idea 2016.2.1搁置了26个Java文件更改,并签出到了不同的分支。
当我来到老店检查我搁置的更改时。
我现在发疯了,我丢失了所有文件。我工作了近两个月
有人可以帮忙找回它吗?
当我将VS 2012中的一些代码搁置到TFS 2012时,我的更改将上传到服务器或保存在本地,当我签入时,这些更改是否会同时将所有货架上传到服务器?