为什么通过Python运行SQLite会导致内存“非官方”填满?
我正在使用SQLite处理一些很大的数据库文件(有几千万条记录,大约10GB)。我用的是Python的标准接口。
当我尝试将数百万条记录插入数据库,或者在某些列上创建索引时,我的电脑内存慢慢就不够用了。如果我查看普通的系统监视器,似乎大部分系统内存都是空闲的。但是,当我使用top命令时,几乎没有系统内存是空闲的。如果我按内存使用量对进程进行排序,发现没有哪个进程使用超过我内存的几个百分点(包括正在运行SQLite的Python进程)。
那么,所有的内存都去哪儿了呢?为什么top和Ubuntu的系统监视器对我有多少系统内存的显示不一致?为什么top告诉我几乎没有空闲内存,同时又不显示哪个进程在使用所有的内存呢?
我正在运行Ubuntu 11.04,sqlite3,python 2.7。
2 个回答
2
十有八九你对Linux的文件系统缓存感到困惑
可以看看这些链接:
可以通过以root身份执行以下命令来测试一下:
echo 3 > /proc/sys/vm/drop_caches
0
内存可能并不是分配给某个进程的,但它可以是比如说tmpfs文件系统上的一个文件(像/dev/shm或/tmp有时会用到)。你应该给我们看一下top
或free
的输出(请注意,这些工具并不会显示一个单一的“内存使用”值),这样我们才能更好地了解内存的使用情况。
在往数据库插入记录时,可能会为当前的事务创建一个临时的影像,这个影像在真正提交到数据库之前是存在的。如果可以的话,把插入操作分成多个独立的事务可能会有所帮助。
我只是猜测,数据不够。
附言:看起来我误解了原问题(我以为是电脑变慢了),其实并没有问题。sehe的回答可能更好。