2016-08-21 2 views
-1

У меня есть скрипт 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. Установка изображения для части спецификации.

enter image description here

Теперь вопрос:

Стандартное исполнение занимает около 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 секунд ---

+0

Я прошел через другие вопросы. Ничто не помогло мне, поэтому задал новый вопрос. – driftking9987

+0

Каков фактический код? –

+0

Я не могу поделиться всем кодом, но я использую DTW-библиотеку для соответствия шаблону в очень широком диапазоне. около 90% от общего времени идет в этой функции (т. е. 90% от 8-9 секунд.) – driftking9987

ответ

1

Вы показали только импорт, а не приложение или конкретную функцию, поэтому моя помощь ограничена.

  1. Как я понимаю, вы вставляете R-язык в python (rpy2 lib). Возможно, вы работаете с видео (cv2 lib). Из-за этого может потребоваться множество других питов python. Вы просто используете множество библиотек. Постарайтесь сделать свой код максимально простым.
  2. Я думаю, что вы наткнулись на PILON GIL (Global Interpreter Lock), когда вы пытались выполнить скрипт параллельно. Но это моя догадка, я действительно не могу узнать из вашего примера, что действительно делает ваше приложение.
+0

В основном я работаю с библиотекой DTW. Нет видео. По очевидной причине я не могу поделиться всем кодом, извините за это. Основная цель функции - сопоставить шаблон в очень широкой области. И я уверен, что других библиотек не называют, кроме упомянутых. И, как я сказал в первом пункте, для одного прогона требуется номинальное количество ресурсов. Для вашей второй точки, я действительно не понимаю этого. Не могли бы вы объяснить? – driftking9987

+0

Лучше объясните здесь: https://wiki.python.org/moin/GlobalInterpreterLock найдите третий абзац, который напрямую касается numpy. –

+0

Добавлен образец кода. Взгляни, пожалуйста. Благодарю. – driftking9987