0

我正在使用 ubuntu。我有一些管理命令在运行时会进行大量数据库操作,因此需要将近 15 分钟。

我的系统监视器显示我的系统有 4 个 cpu 和 6GB RAM。但是,这个过程并没有利用所有 cpu 的 . 我认为它只使用了一个 CPU,而且内存太少了。我想,如果我能够让它使用所有的 cpu 和大部分内存,那么这个过程将在很短的时间内完成。

我尝试了 renice ,将优先级设置为 -18 (意味着非常高),但速度仍然较低。

细节:

它是一个循环数接近 10,000 的 python 脚本,并且有近十个这样的循环。在每个循环中,它都会保存到 postgres 数据库。

4

2 回答 2

0

Just in case, did you run the command renice -20 -p {pid} instead of renice --20 -p {pid}? In the first case it will be given the lowest priority.

于 2013-12-02T08:41:31.920 回答
0

如果您希望让这个应用程序在多个 cpu 上运行,那么您可以根据您的设置尝试多种方法。

想到的最明显的事情是让应用程序利用线程和多进程。这将允许应用程序一次“做更多”。显然,您在这里可能遇到的问题是并发数据库访问,因此您可能需要使用事务(此时您可能首先失去使用多进程的优势)。

其次,确保您没有打开和关闭大量数据库连接,确保您的应用程序可以根据需要保持连接打开。

第三,确保数据库被正确索引。如果您正在对大字符串进行搜索,那么事情会很慢。

第四,尽你所能在 SQL 中将很少的操作留给 python,如果你允许的话,sql 进行数据操作的速度非常快。一旦您开始将数据从数据库中取出并放入代码中,那么事情就会大大减慢。

第五,利用可以在数据库内部缓存和优化的存储过程。这些可以比应用程序构建的查询快得多,这些查询不能那么容易地进行优化。

第六,不要在程序的每次迭代中保存。尝试生成一个批处理样式的作业,您可以在其中更改许多记录,然后将所有这些记录保存在一个批处理作业中。这将减少每次迭代的 IO 量并大大加快进程。

Django 确实支持使用批量更新方法,不久前在 stackoverflow 上也有一个关于一次保存多个 django 对象的问题。

于 2013-03-28T09:47:48.317 回答