SQLite的内存使用与数据库大小无关吗?
我有一个700MB的SQLite3数据库,正在用一个简单的Python程序进行读写。我想了解这个程序在操作数据库时的内存使用情况。我用了以下几种方法:
- 使用Python的memory_profiler来测量主循环函数的内存使用,这个函数负责所有的插入和查询操作。
- 使用Python的psutil来测量执行过程中的峰值内存使用。
- 通过top/htop手动观察内存使用情况。
前两种方法得出的结论是,程序在任何时候的内存使用都不会超过20MB。我可以从一个空数据库开始,然后填充700MB的数据,内存使用仍然保持在20MB以下:
Memory profiler的数据显示从未超过15.805MiB:
Line # Mem usage Increment Line Contents
================================================
...
229 13.227 MiB 0.000 MiB @profile
230 def loop(self):
231 """Loop to record DB entries"""
234 15.805 MiB 2.578 MiB for ev in range(self.numEvents):
...
psutil显示峰值使用为16.22265625MB。
至于top/htop,情况有点奇怪。它们都显示Python进程的内存使用没有超过20MB,但我也能清楚地看到,随着数据库的填充,空闲内存在逐渐减少,这从used的数字上可以看出来:
Mem: 4047636k total, 529600k used, 3518036k free, 83636k buffers
我的问题是:
- 是否存在任何“隐藏”的内存使用?Python调用libsqlite时,是否可能使用一些不被psutil或top报告的内存?
- 上述方法是否适合用来确定与数据库交互的程序的内存使用情况?特别是top:top在测量单个进程的内存使用时是否可靠?
- 与SQLite数据库交互的进程是否真的不需要将数据库的任何大部分加载到内存中就能正常操作?
关于最后一点,我的最终目标是在一个内存有限的嵌入式系统上使用一个大小未知的相当大的SQLite数据库,我想知道无论数据库的大小如何,内存使用是否基本保持不变。
1 个回答
3
SQLite的内存使用量和数据库的大小没有关系;即使是有TB(千兆字节)大小的数据库,SQLite也能很好地处理。它只会加载它需要的数据库部分(再加上一小部分可以设置大小的缓存)。
SQLite在嵌入式系统上也没问题;这其实就是它最初设计的目的。