我正在使用ubuntu。我有一些管理命令,在运行时,会进行大量的数据库操作,因此需要将近15分钟。
我的系统监视器显示我的系统有4个CPU和6GB RAM。但是,这个过程并没有利用所有的cpu。我认为它只使用了一个cpus,而且使用的内存也非常少。我想,如果我能够使用所有cpu和大部分ram,那么这个过程将在很短的时间内完成。
我尝试过renice,设置优先级为-18(意味着非常高),但速度仍然较低。
详细信息:
它是一个循环计数接近10,000的python脚本,而且有近十个这样的循环。在每个循环中,它都保存到postgres数据库。
答案 0 :(得分:0)
如果您希望让这个应用程序在多个cpu上运行,那么根据您的设置,您可以尝试许多方法。
最让人想到的是让应用程序使用线程和多进程。这将允许应用程序立即“做更多”。显然,您可能遇到的问题是并发数据库访问,因此您可能需要使用事务(此时您可能会失去首先使用多进程的优势)。
其次,确保您没有打开和关闭大量数据库连接,确保您的应用程序可以在需要时保持连接打开。
第三,确保数据库已正确编入索引。如果你正在对大字符串进行搜索,那么事情就会变得很慢。
第四,在SQL中你可以做的一切都没有对python进行任何操作,如果你允许的话,sql会非常快速地进行数据操作。一旦你开始从数据库中获取数据并进入代码,那么事情就会变得很慢。
第五,利用可在数据库内部进行缓存和优化的存储过程。这些可以比应用程序构建的查询快得多,这些查询无法轻松优化。
第六,不要节省程序的每次迭代。尝试生成批处理样式的作业,您可以在其中更改多个记录,然后将所有这些记录保存在一个批处理作业中。这将减少每次迭代的IO数量,并大大加快流程。
Django确实支持使用bulk update方法,还有一个关于stackoverflow的问题,一时间关于一次保存多个django对象。
答案 1 :(得分:0)
以防万一,您是否运行了命令renice -20 -p {pid}而不是renice --20 -p {pid}?在第一种情况下,它将被赋予最低优先级。