- android - 多次调用 OnPrimaryClipChangedListener
- android - 无法更新 RecyclerView 中的 TextView 字段
- android.database.CursorIndexOutOfBoundsException : Index 0 requested, 光标大小为 0
- android - 使用 AppCompat 时,我们是否需要明确指定其 UI 组件(Spinner、EditText)颜色
我有一个非常大的 python 搁置对象(磁盘上有 6GB)。我希望能够将它移动到另一台机器上,并且由于架子不可移动,所以我想对其进行 cPickle。为此,我首先必须将其转换为字典。
出于某种原因,当我执行 dict(myShelf)
时,ipython 进程的内存达到 32GB(我所有的机器都有),然后似乎挂起(或者可能只需要很长时间).
谁能解释一下?也许提供一个潜在的解决方法?
编辑:使用 Python 2.7
最佳答案
根据我的经验,我认为酸洗比您目前所做的更耗费内存。但是,创建一个 dict
会立即将 shelf 中的每个键和值加载到内存中,您不应该假设因为您的 shelf 在磁盘上有 6GB,所以它在内存中只有 6GB。例如:
>>> import sys, pickle
>>> sys.getsizeof(1)
24
>>> len(pickle.dumps(1))
4
>>> len(pickle.dumps(1, -1))
5
因此,一个非常小的整数作为 Python int
对象(在我的机器上)比它被 pickle 后大 5-6 倍。
至于解决方法:您可以将多个 pickled 对象写入一个文件。所以不要将 shelf 转换为 dict
,只需将一长串键和值写入您的文件,然后在另一侧读取同样长的键和值序列以放入您的新文件中架子。这样你一次只需要内存中的一个键/值对。像这样:
写:
with open('myshelf.pkl', 'wb') as outfile:
pickle.dump(len(myShelf), outfile)
for p in myShelf.iteritems():
pickle.dump(p, outfile)
阅读:
with open('myshelf.pkl', 'rb') as infile:
for _ in xrange(pickle.load(infile)):
k, v = pickle.load(infile)
myShelf[k] = v
我认为您实际上不需要存储长度,您可以继续阅读,直到 pickle.load
抛出一个异常,表明文件已用完。
关于python - 为什么将 python 'shelve' 转换为 'dict' 使用这么多内存?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/28204603/
我正在尝试使用 shelve使用 Python 3.3。建议使用 with shelve.open('spam.db') as db:... 语法来确保我们关闭“连接”。但是,当我尝试它时,出现以下错
shelve -- 用来持久化任意的Python对象 这几天接触了Python中的shelve这个module,感觉比pickle用起来更简单一些,它也是一个用来持久化Python对象的简单工具。
我正在用 Python 做一个项目,涉及大量与持久字典的交互工作。如果我不进行交互式开发,我可以使用 contextlib.looking 并相当有信心架子最终会被写入磁盘。但就目前情况而言,没有任何
是shelve只读模式坏了?文档说 flag 参数按照 dbm.open 中的说明工作。所以我想如果我在阅读模式下打开我不应该能够改变搁置对象。 页面here似乎还建议修改以只读方式打开的搁置对象应该
我将让以下终端 session 说明一切: >>> import shelve >>> s = shelve.open('TestShelve') >>> from collections impor
对于我的 python 应用程序,我正在考虑使用 shelve , 标准库的一部分。将有数百个进程,每个进程都向同一个搁置对象写入一些内容。写作将始终是将新的键值对添加到货架上。键是唯一的,因此没有两
我一直在使用 Shelve 作为文档存储。键是一个字符串化的整数,值只是字符串中的一些 html。不幸的是,我的脚本最终在数据库中放入了太多条目,以至于发生了错误(我手头没有确切的条目)。数据库的大小
在 TFS 中,我过去常常搁置我的更改作为备份,然后再尝试一些有风险的事情或试验一些事情。 如果一切顺利,我刚刚删除了搁置。否则,我取消搁置备份并继续。 我没有兴趣与任何人分享这些更改。 Git 中的
在 Perforce 中,什么是“搁置”文件?搁置在工作区中打开以供编辑的文件的目的是什么? 最佳答案 来自 Perforce documentation : Shelving is the proc
我有一个执行以下操作的 Python 应用程序: 由另一个进程每 2-3 分钟调用一次,以便使用 with shelve.open(shelvefilename, flag='c') 来存储对象。 被
我正在尝试卡住涉及使用搁置模块的应用程序。为了卡住它,我正在使用 GUI2EXE python 代码并利用 cx_freeze 部分(如果我删除搁置部分,一切都会很好)。 当我去运行我编译的应用程序时
嘿,大家好,我正在为学校做一个项目,我必须问 10 个数学问题,然后存储他们的分数名称和类(class),但唯一的问题是我似乎无法立即回到搁置的工作。下面是我试图开始工作的代码,任何帮助都会很好。 g
我有一个在 OS X 上用 python 2.7.2 开发的应用程序。我使用模块 shelve 并且在 mac 上似乎默认为 bsddb。该程序不会在装有 ActiveState python 2.7
我要 用户A 能够在 Perforce 中创建一个更改列表,然后将其搁置。那么我想要 用户B 能够取消搁置该更改列表并提交它。 这听起来很简单,但 Perforce 上架似乎并不像我期望的那样工作。当
我正在使用 PyMemoize 库来缓存协程。我装饰了协程,但是当 Python 调用它时,我得到: TypeError: can't pickle coroutine objects 发生这种情况是
我已经设置了一个模拟操作系统的 Python 脚本。它有一个命令提示符和一个虚拟文件系统。我正在使用 shelve 模块来模拟文件系统,它是多维的以支持目录层次结构。但是,我无法执行“cd”命令。我不
我正在尝试编写一个使用 shelve 的内存库持久存储返回值。如果我有内存函数调用其他内存函数,我想知道如何正确打开 shelf 文件。 import shelve import functools
我正在运行一个 Python 程序,该程序在 pickle 之上使用 shelve 模块。运行这个程序后,有时我得到一个输出文件 a.data 但有时我得到三个输出文件 a.data.bak, a.d
在 perforce 的源代码管理选项中,我看不到从特定变更列表触发构建的选项。可以这样做吗? 最佳答案 替代解决方案@catchingUp也有可能使用“构建审核”操作点触发构建(可以在构建历史记录正
我安装了 hg shelve(不是阁楼)扩展,并且我想发布补丁。在 git 中,它是 git stash drop 。如何使用搁置扩展来执行此操作? 最佳答案 来自Mercurial shelve d
我是一名优秀的程序员,十分优秀!