Skip to main content
 首页 » 编程设计

python之MS-Access 数据库在插入期间变得非常大

2025年05月04日11haluo1

我有一个数据库,我经常需要通过一些 python 脚本将大量数据导入其中。压缩后,一个月导入的数据大约需要280mb,但在导入过程中文件大小膨胀到一个gb以上。

考虑到 mdb 文件的大小限制为 2gb,这有点令人担心。除了将插入分成 block 并在每个 block 之间进行压缩之外,是否有任何技术可以避免文件大小的增加?

请注意,在此过程中没有创建/删除临时表:只是插入到现有表中。

为了避免不可避免的评论:是的,我需要将此数据存储在 Access 2003 中。不,我无法升级到 Access 2007。

如果有帮助,我可以在 sqlite 中进行预处理。

编辑:

只是添加一些进一步的信息(一些已经在我的评论中列出):

  • 数据在 Python 中逐表生成,然后通过 odbc 插入该表批处理的所有记录
  • 所有处理都在 Python 中进行:mdb 文件所做的只是存储数据
  • 插入的所有字段都是有效字段(没有一个因违反唯一键等原因被排除)

鉴于上述情况,我将研究如何通过 odbc 禁用行级锁定并考虑对数据进行预排序和/或删除然后恢复索引。感谢您的建议。

仍然欢迎任何进一步的建议。

请您参考如下方法:

您确定行锁定已关闭吗?就我而言,在处理 5 兆文件时,关闭行锁定可将膨胀减少 100 多兆。 (换句话说,文件大麦在关闭行锁定到大约 6 兆后增长)。启用行锁定后,相同的操作会生成大小超过 100 兆的文件。

行锁定是记录集操作期间膨胀的一个巨大来源,因为它会将每条记录填充到页面大小。

你在这里安装了 ms-access,还是只是使用 JET(JET 是 ms-access 使用的数据引擎。你可以在没有 Access 权限的情况下使用 JET)。

在 ms-access 中打开数据库并执行:

工具->选项 在高级选项卡上,取消选中该框: [ ] 使用记录级锁定打开数据库。

这不仅会在文件增长(膨胀)方面产生巨大差异,还会将速度提高 10 倍。

还有一个注册表设置,您可以在此处使用。

而且,您使用的是 odbc 还是 oleDB 连接?

你可以试试:

设置 rs = New ADODB.Recordset 与RS .ActiveConnection = RsCnn .Properties("Jet OLEDB:锁定粒度") = 1

尝试 Access 设置(更改设置),退出,重新进入,然后压缩并修复。然后运行您的测试导入……膨胀问题应该会消失。

可能不需要使用行锁定打开数据库。如果您关闭该功能,那么您应该能够将文件大小的膨胀降至最低。

有关进一步阅读和示例,请参见此处: Does ACEDAO support row level locking?