我使用python存储一个表,我需要持久性.
基本上我将表作为字典字符串存储到数字中.整个存放与搁置
self.DB=shelve.open("%s%sMoleculeLibrary.shelve"%(directory,os.sep),writeback=True)
Run Code Online (Sandbox Code Playgroud)
我用writeback,True因为我发现如果不这样做,系统往往会不稳定.
在计算之后,系统需要关闭数据库并将其存储回来.现在数据库(表格)大约是540MB,而且需要很长时间.桌子增长到大约500MB后,时间爆炸了.但我需要一张更大的桌子.事实上我需要其中两个.
我可能正在使用错误的持久性形式.我该怎么做才能提高性能?
我正在创建一个程序,可以访问存储在类中的数据.所以例如我有这个类:
#!/usr/bin/env python
import shelve
cur_dir = '.'
class Person:
def __init__(self, name, score, age=None, yrclass=10):
self.name = name
self.firstname = name.split()[0]
try:
self.lastname = name.split()[1]
except:
self.lastname = None
self.score = score
self.age = age
self.yrclass = yrclass
def yrup(self):
self.age += 1
self.yrclass += 1
if __name__ == "__main__":
db = shelve.open('people.dat')
db['han'] = Person('Han Solo', 100, 37)
db['luke'] = Person('Luke Skywalker', 83, 26)
db['chewbacca'] = Person('Chewbacca', 100, 90901)
Run Code Online (Sandbox Code Playgroud)
所以使用这个我可以调用一个单独的变量,如:
print db['luke'].name
Run Code Online (Sandbox Code Playgroud)
但如果我想打印所有变量,我有点迷失.
如果我跑:
f = db['han']
dir(f) …Run Code Online (Sandbox Code Playgroud) 我正在运行一个使用该shelve模块的Python程序pickle.运行此程序后,有时我得到一个输出文件,a.data但在其他时候我得到三个输出文件a.data.bak,a.data.dir和a.data.dat.
这是为什么?
我最近开始使用MQ,因为我喜欢处理孤立补丁和提交而不影响回购的想法,直到变更集足够精确.在此之前,我曾经使用Mercurial的货架扩展,但发现它有点不稳定.我在MQ中仍然想要弄清楚的是如何使补丁彼此分离并且不按特定顺序应用它们,以及跨越不同的分支.这是我的正常流程 -
1.开始处理新补丁:
hg qnew fix-bug-1234 -m "fix bug 1234"
# do some work
hg qrefresh
Run Code Online (Sandbox Code Playgroud)
2.获取要处理的新功能/错误:
hg qpop fix-bug-1234
hg qnew some-feature -m "implement feature X"
# some work on feature X (perhaps in a different branch)
hg qrefresh
Run Code Online (Sandbox Code Playgroud)
3.此时,我想重新开始修复bugfix,并将功能放在一边.我觉得它很简单:
hg qpop some-feature
hg qpush fix-bug-1234
# wrap up bug fix
hg qfinish fix-bug-1234
# get back to work on feature
Run Code Online (Sandbox Code Playgroud)
但是,MQ似乎总是使用系列中创建的最新补丁,并且无论我使用的qpop/qpush命令如何都应用它.我应该注意,我工作的文件也是完全独立的(虽然它们有时可以是相同的).
我在这里错过了什么吗?我应该用hg qqueue它吗?谢谢.
我希望在Python中对架子/数据库提出一些建议.
问题:我在mac上创建了一个数据库,我想在Windows 7上使用.我使用的是Python 3.2,MacOS 10.7和win 7.
当我打开并将我的货架保存在Mac上时,一切都很好.我得到一个扩展名为".db"的文件.在我的Windows-python上,它无法识别.然而,我可以在PC上创建一个新的数据库并获取带有".bak,dat,.dir"扩展名的文件.
我猜测PC上的python没有我的mac-python使用的相同底层数据库?
我不确定这是哪种方法,但也许我可以:
更改我的系统使用的default-db?找出我的mac-python使用哪个db并在PC上添加?改变我将数据存储在一起的方式?
速度不是问题,数据量是几兆字节,并且不经常访问.
希望能在那里找到帮助.在此先感谢 - 非常感谢任何帮助.
/ Esben
我在做什么:
Import shelve
db = shelve.open('mydb')
entries = db['list']
db.close
Run Code Online (Sandbox Code Playgroud)
它非常简单,我在mac上有一个名为"mydb.db"的工作db文件,但当我尝试在pc-python上打开它时,我得到:
回溯(最近通话最后一个):文件"/Library/Frameworks/Python.framework/Versions/3.2/lib/python3.2/dbm/ 初始化的.py",线路107,在whichdb F = io.open(文件名+" .pag","rb")IOError:[Errno 2]没有这样的文件或目录:'mydb.pag'
我有一个庞大的Python字典向量(150k向量,每个10k维度)的浮点数无法加载到内存中,因此我必须使用这两种方法之一将其存储在磁盘上并在适当时检索特定向量.矢量将被创建并存储一次,但可能会被读取很多次(数千次) - 因此有效读取非常重要.在使用搁置模块进行一些测试之后,我倾向于认为sqlite对于这种任务来说是更好的选择,但在我开始编写代码之前,我想听到更多关于此的意见...例如,还有其他任何其他除了那两个我不知道的选项?
现在,假设我们同意最佳选项是sqlite,另一个问题与表的确切形式有关.我正在考虑使用带有表格行的细粒度结构vector_key, element_no, value来帮助有效分页,而不是将矢量的所有10k元素存储到同一记录中.我真的很感激有关这个问题的任何建议.
我在使用Git一年后才开始使用Perforce.在perforce中我的分支是否有任何等效的git本地提交.
从本质上讲,如果我想处理可能需要撤消和重做我的特定更改的复杂任务,那么在Perforce中有什么方法可以实现这一点吗?我在Git中这样做的方法是将我的更改提交到分支,并在合并到master之前在分支中进行多次提交.
我有一大堆字符串,我正在用于自然语言处理研究,我想要一种很好的方式将它存储在Python中.
我可以使用pickle,但是将整个列表加载到内存中将是不可能的(我相信),因为它大约10 GB,并且我没有那么多的主内存.目前我将列表与shelve库一起存储...架子用字符串索引,"0","1",......,"n"这有点笨重.
有没有更好的方法将这样的对象存储在一个文件中,并且仍然可以随机(ish)访问它?
可能最好的选择是将其拆分为多个列表.
谢谢!
搁置在Python中用于数据持久性线程安全吗?如果没有,有什么好的选择?
我正在使用Pycharm.首先,每当在Pycharm中导入任何模块时.完整的进口线淡出.但是如果import shelve没有淡出.此外,当我运行该文件时,我得到以下错误:
Traceback (most recent call last):
File "/Users/abhimanyuaryan/PycharmProjects/shelve/main.py", line 13, in <module>
s = shelve.open("file.dat")
File "/Library/Frameworks/Python.framework/Versions/3.4/lib/python3.4/shelve.py", line 239, in open
return DbfilenameShelf(filename, flag, protocol, writeback)
File "/Library/Frameworks/Python.framework/Versions/3.4/lib/python3.4/shelve.py", line 223, in __init__
Shelf.__init__(self, dbm.open(filename, flag), protocol, writeback)
File "/Library/Frameworks/Python.framework/Versions/3.4/lib/python3.4/dbm/__init__.py", line 88, in open
raise error[0]("db type could not be determined")
dbm.error: db type could not be determined
Run Code Online (Sandbox Code Playgroud)
这是我的代码:
import shelve
s = shelve.open("file.dat")
s["first"] = (1182, 234, 632, 4560)
s["second"] = {"404": "file is not present", "googling": …Run Code Online (Sandbox Code Playgroud) shelve ×10
python ×8
database ×2
persistence ×2
pickle ×2
branch ×1
class ×1
dictionary ×1
git ×1
list ×1
mercurial ×1
nlp ×1
p4v ×1
perforce ×1
performance ×1
python-3.4 ×1
python-3.x ×1
sqlite ×1
unix ×1
workflow ×1