无论数据库大小如何,SQLite的内存使用量是否保持静态?

时间:2014-05-15 22:17:13

标签: python sqlite memory

我有一个700MB的SQLite3数据库,我用简单的Python程序读/写。 我试图在数据库上运行时测量程序的内存使用情况。我使用过这些方法:

  • 使用Python memory_profiler来测量运行所有插入/选择的主循环函数的内存使用情况
  • 使用Python的psutil来测量执行期间的峰值内存使用量
  • 通过top / htop手动观看内存使用情况

前两个支持在任何给定时间使用不超过20MB的结论。我可以从一个空的数据库开始,用700MB的数据填充它,它仍然低于20MB:

内存分析器的数字从未超过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):
   ...

pstuil 表示峰值使用量为16.22265625MB

现在顶部 / htop 有点怪异。两人都表示python进程的内存使用量不超过20MB,但我还可以清楚地看到,随着通过使用的号码填充数据库,可用内存不断减少: / p>

Mem:   4047636k total,   529600k used,  3518036k free,    83636k buffers

我的问题:

  • 有没有"隐藏"内存使用情况? Python是否以这样的方式调用libsqlite,它可能会使用自己的内存,而不是通过psutil或top报告它属于Python?
  • 是用于确定与数据库交互的程序的内存使用情况的上述方法声音吗?特别是顶部:对于测量单个过程的内存使用率是否最可靠?
  • 与SQLite数据库交互的进程是否或多或少都不需要将任何相当大的部分加载到内存中以便对其进行操作?

关于最后一点,我的最终目标是在内存有限的嵌入式系统上使用一个相当大的未知大小的SQLite数据库,我想知道内存使用是否正常或多或少无论数据库的大小如何都是常数。

1 个答案:

答案 0 :(得分:2)

SQLite的内存使用量不依赖于数据库的大小; SQLite可以很好地处理TB级数据库,它只加载它需要的数据库部分(加上一个小的,可配置大小的缓存)。

SQLite应该适用于嵌入式系统;这本来就是为它设计的。