【问题标题】:Python script taking too much time and memory to executePython 脚本需要太多时间和内存来执行
【发布时间】:2016-08-21 14:40:29
【问题描述】:

我有一个 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')

我正在使用下面的代码行来检查内存使用情况(我只从 SO 中获取它。现在找不到链接。它以 MB 为单位给出了使用情况)。

process= psutil.Process(os.getpid())
print process.memory_info()[0]/float(2**20)

另外,我在亚马逊上使用 m3.large 计划。为规范部分附加图像。

现在的问题是:

标准执行大约需要 8-9 秒。但是当我并行执行大约 7-8 次时,它的执行时间会达到 55-60 秒。当我尝试为超过 10 个用户并行运行它时,所花费的时间最多 120 秒。

我尝试检查内存消耗,单次运行最多需要 70MB 来加载库,然后脚本中的函数需要 90MB。(我也不确定要计算函数的内存消耗,我应该扣除这两个数据即 90-70=20MB)

无论如何,当并行运行时,函数部分的内存消耗增加到~200MB。对于同上相同的参数。

后来我尝试在同一个脚本中执行两次和三次相同的函数,即在同一个脚本中调用主函数 3 次,现在内存消耗为 80MB,直到导入点库,然后第一次,该功能的内存消耗为80MB,第二次为550MB,第三次为700MB。 (这对我来说很奇怪)。

据我了解,这里只是没有遵循并行计算的核心基础。

任何人都可以分享一下这个问题。

如何减少脚本的内存消耗。(通过php文件调用它。它是api调用之一)。

为什么 import 语句每次都消耗那么多内存。 无论并行执行多少次,我如何将每次调用的执行时间保持在 8-9 秒。

编辑

添加示例代码:

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))

第一次运行的输出是:

库加载后消耗的内存: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 秒 ---

【问题讨论】:

  • 我已经完成了其他 SO 问题。没有什么帮助我,这就是为什么发布一个新问题。
  • 实际代码是什么?
  • 我不能真正共享整个代码,但我正在使用 DTW 库来匹配一个非常广泛的模式。大约 90% 的总时间用于该功能(即 8-9 秒的 90%。)
  • “我不能真正分享整个代码”然后尝试使用您可以发布的更简单的代码来复制问题。否则我们帮不了你。
  • 有时间我会分享的。

标签: python memory


【解决方案1】:

您只展示了导入,而不是应用程序或特定功能,所以我的帮助非常有限。

  1. 据我了解,您正在将 R 语言嵌入 python(rpy2 库)。您可能正在处理视频(cv2 lib)。因此,python 可能需要将许多其他库加载到内存中。你只是在使用很多库。尽量让您的代码尽可能简单。
  2. 我想您在尝试并行执行脚本时偶然发现了 Python 的 GIL(全局解释器锁)。但这是我的猜测,我真的无法从您的示例中知道您的应用真正在做什么。

【讨论】:

  • 主要是使用 DTW 库。没有视频。由于显而易见的原因,我不能真正分享整个代码,对此感到抱歉。该函数的主要目的是在一个非常广泛的区域内匹配一个模式。而且我很确定除了提到的库之外没有其他库被调用。正如我在第一点所说的,对于单次运行,它需要名义数量的资源。对于你的第二点,我并没有真正明白这一点。你能解释一下吗?
  • 这里有更好的解释:wiki.python.org/moin/GlobalInterpreterLock 寻找第三段,它直接涉及到 numpy。
猜你喜欢
  • 2013-05-07
  • 2015-12-15
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2020-08-28
  • 1970-01-01
  • 1970-01-01
  • 2021-12-01
相关资源
最近更新 更多