我有一个数据库,我经常需要通过一些 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?
