为什么运行SQLite(通过python)导致内存“非正式”填满?

时间:2011-06-27 11:03:20

标签: python sqlite memory ubuntu memory-leaks

我正在使用SQLite处理一些大的(数千万条记录,大约10GB)数据库文件。我是这个python的标准界面。

当我尝试将数百万条记录插入数据库或在某些列上创建索引时,我的计算机会慢慢耗尽内存。如果我查看正常的系统监视器,看起来大多数系统内存都是免费的。但是,当我使用top时,看起来我几乎没有系统内存空闲。如果我通过内存消耗对进程进行排序,那么它们中的非进程使用了​​超过我内存的百分之几(包括运行sqlite的python进程)。

所有记忆在哪里?为什么top和Ubuntu的系统监控器不同意我有多少系统内存?为什么顶部告诉我,我的内存空闲很少,同时没有显示使用所有内存的进程是什么?

我正在运行Ubuntu 11.04,sqlite3,python 2.7。

2 个答案:

答案 0 :(得分:2)

10比1表示你对linux的文件系统缓冲区/缓存感到困惑

通过执行(以root身份)进行测试

echo 3 > /proc/sys/vm/drop_caches

答案 1 :(得分:0)

存储器可能未分配给进程,但可以是例如tmpfs文件系统上的文件(/ dev / shm,/ tmp有时)。您应该向我们展示topfree的输出(请注意这些工具不会显示单个“内存使用”值),以便让我们详细了解内存使用情况。

如果将记录插入数据库,它可能是在将当前事务提交到真实数据库之前为当前事务创建的临时映像。将插入拆分为许多单独的事务(如果适用)可能会有所帮助。

我只是猜测,没有足够的数据。

P.S。我似乎错误地阅读了原始问题(我假设计算机速度变慢)并且没有问题。谢谢的答案可能更好。