我正在使用ubuntu。我有一些管理命令,当运行时,做了很多数据库操作,所以它需要近15分钟。
我的系统监视器显示我的系统有4个cpu和6 6GB。但是,这个过程并没有利用所有的cpu。我认为它只使用了其中一个cpus,而且ram也非常少。我认为,如果我能够使用所有的cpu和大部分的ram,那么这个过程将在非常短的时间内完成。
我尝试了renice,将优先级设置为-18 (意味着非常高),但速度仍然较慢。
详细信息:
这是一个python脚本,其循环数接近10,000,且接近10个这样循环。在每个循环中,它保存到postgres数据库。
发布于 2013-03-28 17:47:48
如果你想让这个应用程序在多个cpu上运行,那么根据你的设置,你可以尝试很多方法。
我想到的最明显的事情就是让应用程序使用线程和多进程。这将允许应用程序一次“做更多”。显然,您在这里可能遇到的问题是并发数据库访问,因此您可能需要使用事务(在这一点上,您可能首先失去使用多进程的优势)。
其次,确保您没有打开和关闭大量的数据库连接,确保您的应用程序可以在需要的时间内保持连接打开。
第三,确保数据库被正确索引。如果你是在大字符串上进行搜索,那么搜索速度会很慢。
第四,在SQL中做你能做的一切,把很少的操作留给python,如果你允许的话,sql在进行数据操作时速度快得惊人。一旦你开始将数据从数据库中提取出来并放入代码中,那么事情就会变得很慢。
第五,使用可以在数据库内部缓存和优化的存储过程。这些可能比应用程序构建的查询快得多,后者不容易优化。
第六,不要在程序的每一次迭代中都省钱。尝试生成一个批处理样式的作业,您可以在其中更改许多记录,然后在一个批处理作业中保存所有这些记录。这将减少每次迭代的IO数量,并大幅加速该过程。
Django确实支持使用bulk update方法,前段时间在stackoverflow上也有一个关于一次保存多个django对象的问题。
发布于 2013-12-02 16:41:32
以防万一,您是否运行了命令renice --20 -p {pid}而不是renice - -20 -p {pid}?在第一种情况下,它将被赋予最低优先级。
https://stackoverflow.com/questions/15678119
复制相似问题