标签: shelve

Python搁置OutOfMemory错误

我有一些数据存储在我想要处理的数据库中.数据库访问非常缓慢,因此我决定在进行任何处理之前将所有数据加载到字典中.但是,由于存储的数据量巨大,我得到了一个内存不足的错误(我看到使用了超过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(),但这也无济于事.

谢谢!

python persistence dictionary shelve out-of-memory

2
推荐指数
1
解决办法
2283
查看次数

搁置给出了奇怪的错误

我正试图将我爬进的一些网站放入货架,但货架不会接受任何网站对象.它会接受列表,字符串,元组,你有什么,但是当我放入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 shelve

2
推荐指数
1
解决办法
1001
查看次数

Python 3.1.1中的搁置模块

我是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)]

感谢您对新手的帮助!

python shelve

2
推荐指数
1
解决办法
2161
查看次数

Python搁置错误 - 声明NoneType,但对象*是*

我刚刚碰到了一个完全奇怪的错误.我将选择的东西保存到一个文件中.其中一个是名为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)

python shelve nonetype

2
推荐指数
1
解决办法
1412
查看次数

在Python中为键添加值?

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 append shelve pickle

2
推荐指数
1
解决办法
784
查看次数

搁置,Python,更新字典

我正在使用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)

我不明白为什么不更新?有什么想法吗?

python dictionary shelve

1
推荐指数
1
解决办法
2473
查看次数

Perforce:将搁置的文件从工作区移动到备份

我有一些旧的搁置文件在长期待定的Perforce变更列表中,我可能永远不会提交.我想摆脱那些变更列表,因为它们污染了我的空间,但我不想失去一切,以防万一我需要那些,所以我需要备份.

有没有办法将搁置文件从更改列表移动到文件系统的某个位置?

将搁置的文件从P4V拖放到Windows资源管理器不起作用.命令行工具p4 unshelve似乎没有这样的选项.我还想避免在备份文件之前先取消文件,因为如果这些文件已经通过编辑检出,这将意味着额外的麻烦.

编辑

阅读答案让我意识到我真正想要的是保持这种变更列表安全,但远离视图(即远离我的常规工作空间).我不在乎它是在我的文件系统上还是在其他地方.所以我的问题实际上是:

有没有办法将搁置的文件从工作区移开备份?

backup perforce shelve unshelve

1
推荐指数
1
解决办法
2096
查看次数

找回丢失的货架更改

我已经通过Intellij Idea 2016.2.1搁置了26个Java文件更改,并签出到了不同的分支。

当我来到老店检查我搁置的更改时。

我现在发疯了,我丢失了所有文件。我工作了近两个月

有人可以帮忙找回它吗?

shelve intellij-idea

1
推荐指数
3
解决办法
2018
查看次数

TFS 2012货架

当我将VS 2012中的一些代码搁置到TFS 2012时,我的更改将上传到服务器或保存在本地,当我签入时,这些更改是否会同时将所有货架上传到服务器?

tfs shelve tfs2012

0
推荐指数
1
解决办法
76
查看次数