У меня есть скрипт python, который использует довольно много библиотек.Python скрипт занимает слишком много времени и памяти для выполнения
import 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')
Am, используя следующую строку кодов, чтобы проверить использование памяти (я взял его из SO только. Не могу найти ссылку прямо сейчас. Это дает использование в МБ).
process= psutil.Process(os.getpid())
print process.memory_info()[0]/float(2**20)
Кроме того, я использую план m3.large на Amazon. Установка изображения для части спецификации.
Теперь вопрос:
Стандартное исполнение занимает около 8-9 секунд. Но когда я выполняю его параллельно примерно 7-8 раз, это время выполнения стреляет до 55-60 секунд. Когда я пытаюсь запустить его параллельно для более чем 10 пользователей, время занимает до 120 секунд.
Я попытался проверить потребление памяти, для одного прогона требуется загрузка до 70 МБ для загрузки библиотек, тогда функция в скрипте занимает 90 МБ. (Я также не уверен, что для вычисления потребления памяти для этой функции я должен вычесть два данных, т. е. 90-70 = 20 МБ)
В любом случае, при параллельном запуске, потребление памяти увеличивается до ~ 200 МБ для функциональной части. Для этих же параметров.
Позже я попытался выполнить одну и ту же функцию дважды и трижды в том же скрипте, то есть назвал главную функцию 3 раза в том же скрипте, теперь потребление памяти составляет 80 МБ, пока библиотеки точек не импортируются, а затем в первый раз, кумуляция памяти для функции составляет 80 МБ, второй раз - 550 МБ, а в третий раз - 700 МБ. (Это совершенно странно для меня).
Насколько я понимаю, основной принцип параллельных вычислений здесь не сопровождается.
Может кто-нибудь, пожалуйста, поделитесь этим светом.
Как уменьшить потребление памяти скриптом. (Я вызываю его через php-файл. Это один из вызовов api).
Почему оператор импорта потребляет столько памяти каждый раз. Как сохранить время выполнения до 8-9 секунд для каждого вызова за любое количество раз, когда оно выполняется параллельно.
EDIT
Добавление образца кода:
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(700),range(700),range(700)]).transpose()
query = np.array([range(10000),range(10000),range(10000)]).transpose()
# dtw algo as a function
def dtw(template,query):
alignment = R.dtw(R.matrix(template,nrow=template.shape[0],ncol=template.shape[1]),R.matrix(query,nrow=query.shape[0],ncol=query.shape[1]),keep=True, step_pattern=R.rabinerJuangStepPattern(st_pt,"c"), open_begin=True, open_end=True)
dist = alignment.rx('distance')[0]
return dist
#running dtw function with parameters = template, query and calculating memory consumtion
#run 1
dtw(template,query)
process= psutil.Process(os.getpid())
print " Memory Consumed at dtw1: "
print process.memory_info()[0]/float(2**20)
#run 2
dtw(template,query)
process= psutil.Process(os.getpid())
print " Memory Consumed at dtw2: "
print process.memory_info()[0]/float(2**20)
#run 3
dtw(template,query)
process= psutil.Process(os.getpid())
print " Memory Consumed at dtw3: "
print process.memory_info()[0]/float(2**20)
#time taken
print(" --- %s seconds ---" % (time.time() - start_time))
Выход для 1-го прогона:
памяти Потребляемый после библиотеки нагрузка: 74,234375
памяти Потребляемый на dtw1: 350.53125
Объем памяти, потребляемый при dtw2: 377.3125
Объем памяти, потребляемый при dtw3: 537.9140625 --- 8.82202100754 секунд ---
И когда я запускаю его параллельно в 5 раз, выход следующим образом:
памяти Потребляемый после загрузки библиотек: +74,87109375
памяти Потребляемый на dtw1: +351,16796875
Память потребляются dtw2: 377.94921875
памяти, потребляемой в dtw3: 538.55078125 --- 25.3154160976 секунд ---
Я прошел через другие вопросы. Ничто не помогло мне, поэтому задал новый вопрос. – driftking9987
Каков фактический код? –
Я не могу поделиться всем кодом, но я использую DTW-библиотеку для соответствия шаблону в очень широком диапазоне. около 90% от общего времени идет в этой функции (т. е. 90% от 8-9 секунд.) – driftking9987