Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/python/323.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
在python中,我在多个函数中使用多处理的深度如何?_Python_Numpy_Scipy_Multiprocessing - Fatal编程技术网

在python中,我在多个函数中使用多处理的深度如何?

在python中,我在多个函数中使用多处理的深度如何?,python,numpy,scipy,multiprocessing,Python,Numpy,Scipy,Multiprocessing,预先警告:我知道这段代码中有很多是没有意义的,为了回答我的问题,我简化了大部分代码,为了表示我正在使用的代码,我不想删除真实代码中的很多函数。但这样你就不必再浏览几百行行话了。在这种形式下,它确实适合我 我试图使用多处理来绕过script(),当我以我想要的方式运行它时,它会使我的内存最大化。请注意,下面有两个等式函数,一个是简化版本,它只使用我建立的一个等式运行。真正的一个被注释掉了。理想情况下,我想运行一个包含所有六个方程的方程 import numpy as np from scipy.o

预先警告:我知道这段代码中有很多是没有意义的,为了回答我的问题,我简化了大部分代码,为了表示我正在使用的代码,我不想删除真实代码中的很多函数。但这样你就不必再浏览几百行行话了。在这种形式下,它确实适合我

我试图使用多处理来绕过script(),当我以我想要的方式运行它时,它会使我的内存最大化。请注意,下面有两个等式函数,一个是简化版本,它只使用我建立的一个等式运行。真正的一个被注释掉了。理想情况下,我想运行一个包含所有六个方程的方程

import numpy as np
from scipy.odr import ODR, Model, Data, RealData
from scipy import stats
from scipy.optimize import curve_fit
import itertools
np.set_printoptions(threshold=np.nan)

def anym(ay):
    return True

def avyrns(avars):
    return avars

def vay(me):
    xem = np.transpose(me)
    xamma = np.array([])
    for xim in range(len(xem)):
        jim = stats.variation(xem[xim]) * 100
        xamma = np.hstack((xamma, jim))
    return xamma


def lin(lx, ly, lstdd, lstdc, lqcd, lqcc, lqcdi):
    lslope, lintercept, lr_value, lp_value, lstd_err = stats.linregress(lx, ly)
    lnewstanlinvals = (lstdd - lintercept) / lslope
    lnewqclinvals = (lqcd - lintercept) / lslope
    lern = lnewstanlinvals, lnewqclinvals, lstdd, lstdc, lqcd, lqcc, lqcdi
    return np.array([lern, ['Linear', 'stats.lingress', [lx], [ly]]])

def sq(x, a, b, c):
    return a*x**(2) + b*x + c

def sqa(x, a, b, c, d):
    return a*x**(3) + b*x**(2) + c*x + d

def squin(sqx, sqy, sqstdd, sqstdc, sqqcd, sqqcc, sqqcdi):
    popt, pcov = curve_fit(sq, sqx, sqy)
    sqnewstanvals = sq(sqstdd, *popt)
    sqnewqcvals = sq(sqqcc, *popt)
    sqern = sqnewstanvals, sqnewqcvals, sqstdd, sqstdc, sqqcd, sqqcc, sqqcdi
    return np.array([sqern, ['x^3', 'scipy.curve_fit', [sqx], [sqy]]])

def squan(sqx, sqy, sqstdd, sqstdc, sqqcd, sqqcc, sqqcdi):
    popt, pcov = curve_fit(sqa, sqx, sqy)
    sqnewstanvals = sqa(sqstdd, *popt)
    sqnewqcvals = sqa(sqqcc, *popt)
    sqern = sqnewstanvals, sqnewqcvals, sqstdd, sqstdc, sqqcd, sqqcc, sqqcdi
    return np.array([sqern, ['x^2', 'scipy.curve_fit', [sqx], [sqy]]])

def func(beta, x):
    y = beta[0]+beta[1]*x+beta[2]*x**3
    return y

def leastsq(oqx, oqy, oqstdd, oqstdc, oqqcd, oqqcc, oqqcdi):
    modata = RealData(oqx, oqy)
    model = Model(func)
    odr = ODR(modata, model, [0,0,0])
    odr.set_job(fit_type=2)
    output = odr.run()
    newstdv = func(output.beta, oqstdd)
    newqcv = func(output.beta, oqqcd)
    oern = newstdv, newqcv, oqstdd, oqstdc, oqqcd, oqqcc, oqqcdi
    return np.array([oern, ['ODR-Leastsq', 'scipy.ODR', [oqx], [oqy]]])

def odri(oqx, oqy, oqstdd, oqstdc, oqqcd, oqqcc, oqqcdi):
    modata = RealData(oqx, oqy)
    model = Model(func)
    odr = ODR(modata, model, [0,0,0])
    odr.set_job(fit_type=1)
    output = odr.run()
    newstdv = func(output.beta, oqstdd)
    newqcv = func(output.beta, oqqcd)
    oern = newstdv, newqcv, oqstdd, oqstdc, oqqcd, oqqcc, oqqcdi
    return np.array([oern, ['ODR-Implicit', 'scipy.ODR', [oqx], [oqy]]])

def odre(oqx, oqy, oqstdd, oqstdc, oqqcd, oqqcc, oqqcdi):
    modata = RealData(oqx, oqy)
    model = Model(func)
    odr = ODR(modata, model, [0,0,0])
    odr.set_job(fit_type=0)
    output = odr.run()
    newstdv = func(output.beta, oqstdd)
    newqcv = func(output.beta, oqqcd)
    oern = newstdv, newqcv, oqstdd, oqstdc, oqqcd, oqqcc, oqqcdi
    return np.array([oern, ['ODR-Explicit', 'scipy.ODR', [oqx], [oqy]]])

#def eqs(ex, ey, estdd, estc, eqcd, eqcc, eqcdi):
#    return np.array([lin(ex, ey, estdd, estc, eqcd, eqcc, eqcdi), squin(ex, ey, estdd, estc, eqcd, eqcc, eqcdi), squan(ex, ey, estdd, estc, eqcd, eqcc, eqcdi), leastsq(ex, ey, estdd, estc, eqcd, eqcc, eqcdi), odri(ex, ey, estdd, estc, eqcd, eqcc, eqcdi), odre(ex, ey, estdd, estc, eqcd, eqcc, eqcdi)])

def eqs(ex, ey, estdd, estc, eqcd, eqcc, eqcdi):
    return np.array([lin(ex, ey, estdd, estc, eqcd, eqcc, eqcdi)])

def script():
    varis = np.array([1, 2, 3, 4, 5, 6, 7, 8, 9, 10])
    conaris = np.array([1, 2, 3, 4, 5, 6, 7, 8, 9, 10])
    stdvars = np.array([1, 2, 3, 4, 5, 6, 7, 8, 9, 10])
    stcvars = np.array([1, 2, 3, 4, 5, 6, 7, 8, 9, 10])
    qcdvars = np.array([1, 2, 3, 4, 5, 6, 7, 8, 9, 10])
    qccvars = np.array([1, 2, 3, 4, 5, 6, 7, 8, 9, 10])
    qcdil = np.array([1, 2, 3, 4, 5, 6, 7, 8, 9, 10])

    xanna = 0
    holder = np.linspace(0, len(stdvars)-1, len(stdvars)).astype(np.int64)
    for li in range(len(holder)+1):
      for subset in itertools.combinations(holder, li):
          if li > 7:
              holding =  np.int64(subset)
              linmo =  eqs(varis[holding], conaris[holding], stdvars, stcvars, qcdvars, qccvars, qcdil)
              for xant in range(len(linmo)):
                  if anym(linmo[xant][0]) == True:
                      if xanna == 0:
                          linmarv = avyrns(linmo[xant][0])
                          xanna = 1
                          mim = np.array([linmo[0], linmarv[0], linmarv[1]])
                      elif xanna == 1:
                          linmarv = avyrns(linmo[xant][0])
                          mam = np.array([linmo[0], linmarv[0], linmarv[1]])
                          mim = np.vstack((mim, mam))
    print mim[-10:]

script()
单方程版本在不进行多处理的情况下可以很好地运行这段代码,但我认为这是确定我是否正确使用多处理函数的一个良好起点。因此,我添加了这些附加内容,并使其发挥作用:

import multiprocessing
def throw_away_function(_):
    return script()

if __name__ == '__main__':
    pool = multiprocessing.Pool(6)
    results = pool.map(throw_away_function, range(10))
    print(results)
一开始,我有点太激动了,因为这在单方程版本上有效,所以我取消了对真实版本的注释,并尝试了一下。它似乎工作得很好,处理器和内存都没有接近最大化。它运行了约3分钟后,我听到一串windows 10的三音“你们不能那个样做”的声音,声音彼此非常接近,听起来好像我的电脑真的放了一个屁

我的屏幕立刻变黑了,只显示了鼠标~5分钟后,屏幕显示出来,许多其他应用程序崩溃,但python没有!虽然我的CPU进程都小于2%,这是非常可疑的,因为代码仍然没有返回我想要的结果。在尝试重新启动计算机10分钟后,它终于重新启动,并像往常一样返回

我也不确定我是否可以自己处理多进程脚本(),或者我是否应该为我所做的所有函数都这样做?所有函数都被script()使用,因此我假设默认情况下,这会将所有其他函数合并到多处理中


但我显然做错了什么,有没有人能给我一些帮助建议,让这个过程更有效率?

odri方程堵塞了内存,原因我不确定,我以为整个过程都是内存密集型的,但实际上不是,我甚至不需要对它进行多处理。

如果不尝试遍历所有代码,您怎么会认为
多处理
可以让您在没有它的情况下做一些超出可用内存的事情?没有多处理的Python将继续消耗内存,直到您的系统基本崩溃(达到硬件限制),而不考虑多处理?我让别人推荐我使用多线程来解决以前的问题,我去学习了更多关于这些方面的知识。我在这里遇到的问题似乎是CPU受限的,所以我认为这将是一个有用的解决方法。是我错了吗?好吧,多线程不会有助于解决CPU受限的问题,因为内存不足,所以您通常可以使用多处理来解决这个问题。然而,即使您的代码受CPU限制,也不会有代码提供更多的RAM。也许可以找到代码中最需要内存的部分,看看是否有办法解决这个问题。你需要把这些都记在记忆里吗?事实上,你让我修补了一些东西。这整件事总的来说不应该这么慢。我的odri方程占用了大量的内存,原因我无法解释,但一旦我消除了这一点,所有的东西都很好。嗯,我想这个问题是没有必要的,我只是有点困惑。谢谢:)我以为混淆是日常工作的一部分,所以不用担心:)我想我无法用这个例子回答
odri
中的错误。我建议你发表你自己对这个问题的答案,并接受它来结束它,然后试着在那里找出你的错误。如果你不理解它,把它归结为最小的、可重复的例子,然后作为问题发布。你做了什么更改?我现在删除了odri,我还有其他配件需要制作工作模型。我最终可以得到我的隐式odr,但我必须单独处理这个问题。