【发布时间】:2016-08-29 11:17:07
【问题描述】:
我有一个 Python 脚本,它在独立执行时的执行时间为 1.2 秒。
但是当我并行执行 5-6 次(我使用邮递员多次 ping url)时,执行时间会增加。
添加所用时间的细分。
1 run -> ~1.2seconds
2 run -> ~1.8seconds
3 run -> ~2.3seconds
4 run -> ~2.9seconds
5 run -> ~4.0seconds
6 run -> ~4.5seconds
7 run -> ~5.2seconds
8 run -> ~5.2seconds
9 run -> ~6.4seconds
10 run -> ~7.1seconds
这是一个示例代码:
import psutil
import os
import time
start_time = time.time()
import cgitb
cgitb.enable()
import numpy as np
import MySQLdb as mysql
import cv2
import sys
import rpy2.robjects as robj
import rpy2.robjects.numpy2ri
rpy2.robjects.numpy2ri.activate()
from rpy2.robjects.packages import importr
R = robj.r
DTW = importr('dtw')
process= psutil.Process(os.getpid())
print " Memory Consumed after libraries load: "
print process.memory_info()[0]/float(2**20)
st_pt=4
# Generate our data (numpy arrays)
template = np.array([range(84),range(84),range(84)]).transpose()
query = np.array([range(2500000),range(2500000),range(2500000)]).transpose()
#time taken
print(" --- %s seconds ---" % (time.time() - start_time))
我还使用watch -n 1 free -m检查了我的内存消耗,内存消耗也明显增加。
1) 如何确保脚本的执行时间每次都保持不变。
2) 我是否可以永久加载库,从而最大限度地减少脚本加载库所花费的时间和消耗的内存?
我做了一个环境并尝试使用
#!/home/ec2-user/anaconda/envs/test_python/
但它没有任何区别。
编辑:
我有 7.5GB RAM 的 AMAZON EC2 服务器。
我用来调用 python 脚本的 php 文件。
<?php
$response = array("error" => FALSE);
if($_SERVER['REQUEST_METHOD']=='GET'){
$response["error"] = FALSE;
$command =escapeshellcmd(shell_exec("sudo /home/ec2-user/anaconda/envs/anubhaw_python/bin/python2.7 /var/www/cgi-bin/dtw_test_code.py"));
session_write_close();
$order=array("\n","\\");
$cleanData=str_replace($order,'',$command);
$response["message"]=$cleanData;
} else
{
header('HTTP/1.0 400 Bad Request');
$response["message"] = "Bad Request.";
}
echo json_encode($response);
?>
谢谢
【问题讨论】:
-
在没有太多关于并行化的知识的情况下,我认为有一定的阈值可以更有效地使用并行化。由于库的加载时间过长,您可能低于该阈值。
-
我的印象是环境服务于这个目的,即制作环境并在其中加载所有必需的库并在任何地方使用该环境。但我认为情况并非如此。我可以在这里做什么?
-
1) 我如何确保脚本的执行时间每次都保持不变。
-
我有 amazon ec2 服务器,我有 7.5GB 的 RAM,使用命令
watch -n 1 free -m,我可以看到每次执行需要将近 300MB。所以我想,如果我同时运行其中的 10 个,就有足够的 RAM 资源可供它们执行。所以至少对于其中的 10 个,执行时间应该是相同的。对吗? -
这是在什么 type of EC2 instance 上运行的?