python - 带有python : where is data stored before commit?的sqlite3

标签 python memory sqlite commit

我看到了一个类似于我的问题,但一般是针对 SQL 数据库的。它说当你插入数据但在提交之前,只有命令被保存并且它们被保存在RAM中。只有commit后RAM才会被清空,数据才会进入数据库。

但是,我想我注意到了将 sqlite3 与 Python 结合使用时的不同行为。我在脚本的最后留下了我的 promise 。我的程序空间不足并中途中止,但这不是因为 RAM 已满。它说磁盘空间已满,我确认我的计算机上确实已满,很大一部分被我的数据库文件占用了。

我知道我需要更多的磁盘空间来创建这个数据库,这不是问题,但我想知道,至少特别是对于 sqlite3 和 Python(如果特定情况很重要),我的数据实际发生了什么/提交前的命令?换句话说,它们存储在哪里以及如何存储?不同的数据库有区别吗?我是否应该担心在使用数据库时直到最后才提交会耗尽我的所有 RAM?

最佳答案

SQLite 在临时 rollback journal file 中复制未修改的数据页,并将您的更改应用于这些相同页面的内存副本。当您进行足够多的更改以致内存成为问题时,更改将刷新到原始数据库。回滚日志用于回滚未完成的事务。

不同的数据库如何处理回滚日志在很大程度上取决于数据库的实现。符合 ACID 的数据库必须将未提交的事务数据存储在某处,而磁盘支持的日志是一个显而易见的选择。

SQLite 文档包括 exhaustive explanation关于它究竟是如何实现交易的。

关于python - 带有python : where is data stored before commit?的sqlite3,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/18515649/

相关文章:

c++ - 动态内存分配是如何工作的

ios - 在不丢失数据的情况下更改 Live App 的数据库

Activity 之间共享的Android SQLite数据库

python - 为什么在 Python 中为 msvcr100 调用 kernel32.GetModuleHandleA() 失败?

python - 如何聚合数据框然后用 Pandas 转置它

tensorflow - 层密集需要 1 个输入,但它收到 2 个输入张量,我该如何更改它

不同 DBMS 中的 SQL

python - 尝试连接到 CosmosDB 数据库时出现 pymongo.errors.ServerSelectionTimeoutError

c - 在 C 中返回字符串。为什么这有效?

java - 如何识别 Windows 中的默认 Java 堆大小