- c - 在位数组中找到第一个零
- linux - Unix 显示有关匹配两种模式之一的文件的信息
- 正则表达式替换多个文件
- linux - 隐藏来自 xtrace 的命令
我的任务是读取一个 .txt 文件,该文件是各种事件的日志,并将其中一些事件写入字典。
问题是文件有时会超过 3GB。这意味着字典变得太大而无法放入主存。似乎Shelve是解决这个问题的好方法。但是,由于我将不断修改字典,因此我必须启用 writeback
选项。这是我担心的地方 - 教程说这会减慢读/写过程并使用更多内存,但我无法找到有关速度和内存如何受到影响的统计信息。
谁能阐明读/写速度和内存受到的影响有多大,以便我可以决定是使用回写选项还是为了代码效率牺牲一些可读性?
谢谢
最佳答案
对于这种规模的数据库,搁置确实是错误的工具。如果您不需要高可用性客户端/服务器架构,而只想将 TXT 文件转换为本地内存可访问数据库,那么您确实应该使用 ZODB
如果你需要高可用的东西,你当然需要切换到正式的“NoSQL”数据库,其中有很多可供选择。
这是一个简单的示例,说明如何将您的搁置数据库转换为 ZODB 数据库,这将解决您的内存使用/性能问题。
#!/usr/bin/env python
import shelve
import ZODB, ZODB.FileStorage
import transaction
from optparse import OptionParser
import os
import sys
import re
reload(sys)
sys.setdefaultencoding("utf-8")
parser = OptionParser()
parser.add_option("-o", "--output", dest = "out_file", default = False, help ="original shelve database filename")
parser.add_option("-i", "--input", dest = "in_file", default = False, help ="new zodb database filename")
parser.set_defaults()
options, args = parser.parse_args()
if options.in_file == False or options.out_file == False :
print "Need input and output database filenames"
exit(1)
db = shelve.open(options.in_file, writeback=True)
zstorage = ZODB.FileStorage.FileStorage(options.out_file)
zdb = ZODB.DB(zstorage)
zconnection = zdb.open()
newdb = zconnection.root()
for key, value in db.iteritems() :
print "Copying key: " + str(key)
newdb[key] = value
transaction.commit()
关于Python 搁置模块内存消耗,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/6115100/
嗨,这是我的搁架条目结构 { 'Birds' : { 'BlueOnes': ["detailsAboutBlueBird"], 'RedOnes' : ["d
是否可以对已打开的文件使用搁置?我想执行如下操作,但 shelve.open 不接受文件描述符。 f = open('file.shelve') s = shelve.open(f) 最佳答案 搁
搁置 documentation说: The choice of which database package will be used (such as dbm, gdbm or bsddb) de
我正在使用 Pycharm。首先,无论何时在 Pycharm 中导入任何模块。完整的导入行淡出。但如果 import shelve 不会淡出。此外,当我运行该文件时,出现以下错误: Traceback
我已搁置文件a.txt, b.txt, c.txt . 现在我想对 a.txt 和 b.txt 进行一些更改,并与新文件 d.txt 一起搁置。 所以, 第一步,使用 p4 unshelve -s
我有一个包含大量文件的更改列表。我必须处理其他请求,所以我使用 p4 shelve -c 899 搁置了更改.但是当我打开 p4 时,文件仍然显示在工作区中。 由于数量很大,我想一次还原所有文件。我试
我在 Python 中使用 Shelve 时遇到问题: In [391]: x Out[391]: {'broken': {'position': 25, 'page': 1, 'letter': '
我正在尝试将一个字典的字典添加到搁置文件中: >>> d = shelve.open('index.shelve') >>> d >>> print(list(d.keys())) [] >>> d
我创建了一个名为 foo_module.py 的文件,其中包含以下代码: import shelve, whichdb, os from foo_package.g import g g.shelf
我是 Team Foundation Server 的新手,所以我想知道“搁置待处理更改”在 Team Foundation Server 中的作用是什么。我正在 Codeplex 上使用项目的 TF
我正在从 .nib 文件创建 .strings。也就是说,我正在将 .nib 文件更改为 Xcode 9.2 上的本地化字符串文件。 现在我得到了 .strings 文件,其中包含所有需要的字符串和根
我使用 Git 进行版本控制,Android Studio 与它很好地集成,非常喜欢! 但现在,我做了“VCS->搁置更改...” 然后 POOF,他们不见了。我以为我需要使用存储,但后来我想让我们看
我使用搁置看到了这种行为: import shelve my_shelve = shelve.open('/tmp/shelve', writeback=True) my_shelve['a'] =
我正在使用 shelve 来存储一些数据。 Traceback (most recent call last): File "rogue.py", line 312, in curs
我是一名优秀的程序员,十分优秀!