我开发了一个解析大量数据的应用程序,但如果我在解析完所有数据后提交数据,它将消耗太多内存。但是,我不能每次都提交它,因为它需要太多的硬盘I / O.
因此,我的问题是如何知道会话中有多少未提交的项目?
答案 0 :(得分:1)
您可以使用session.new。它是刚创建和未创建对象的集合。 session.dirty也很有用。引用文档:
# pending objects recently added to the Session
session.new
# persistent objects which currently have changes detected
# (this collection is now created on the fly each time the property is called)
session.dirty
# persistent objects that have been marked as deleted via session.delete(obj)
session.deleted
# dictionary of all persistent objects, keyed on their
# identity key
session.identity_map
答案 1 :(得分:1)
您可以使用session.new
,session.dirty
和session.deleted
,结合跟踪刷新来跟踪未提交的更改(导致.new,.dirty和.deleted to reset)通过事件系统。有关详细信息,请参阅此处的对话:https://groups.google.com/forum/#!topic/sqlalchemy/eGxpQBChXQw
答案 2 :(得分:0)
这是缓冲的经典案例。如果磁盘I / O太多(或者你不喜欢导致长时间暂停等),请尝试相当大的块并减少它,如果你的配置文件在I / O调用中显示太多的CPU时间,则增加它。
要实现,请使用数组,每次“写入”将项目附加到数组。有一个单独的“刷新”功能,写入整个事情。每个追加您检查,如果它已达到最大大小,请全部写入,并清除阵列。最后,调用flush函数写入部分填充的数组。