簡體   English   中英

python內存密集腳本

[英]python memory intensive script

經過大約4個星期的學習,實驗等,我終於有了一個腳本,可以執行我想要的操作。 它根據我創建的某個投影矩陣來更改圖像的透視圖。 當我為一張圖像運行腳本時,它可以正常工作,但是我想在一張圖中繪制六張圖像。 當我嘗試執行此操作時,出現內存錯誤。

所有圖片的寬度均為2448像素,高度為2048像素。 我的劇本:

files = {'cam1': 'c1.jpg',
         'cam2': 'c2.jpg',
         'cam3': 'c3.jpg',
         'cam4': 'c4.jpg',
         'cam5': 'c5.jpg',
         'cam6': 'c6.jpg'}

fig, ax = plt.subplots()

for camname in files:
    img = Image.open(files[camname])
    gray_img = np.asarray(img.convert("L"))
    img = np.asarray(img)
    height, width, channels = img.shape

    usedP = np.array(P[camname][:,[0,1,3]])
    usedPinv = np.linalg.inv(usedP)
    U, V = np.meshgrid(range(gray_img.shape[1]),
                       range(gray_img.shape[0]))
    UV = np.vstack((U.flatten(),
                    V.flatten())).T
    ones = np.ones((UV.shape[0],1))
    UV = np.hstack((UV, ones))

    # create UV_warped
    UV_warped = usedPinv.dot(UV.T).T

    # normalize vector by dividing by the third column (which should be 1)
    normalize_vector = UV_warped[:,2].T
    UV_warped = UV_warped/normalize_vector[:,None]

    # masks
    # pixels that are above the horizon and where the V-projection is therefor positive (X in argus): make 0, 0, 1
    # pixels that are to far: make 0,0,1
    masks = [UV_warped[:,0]<=0, UV_warped[:,0]>2000, UV_warped[:,1]>5000, UV_warped[:,1]<-5000] # above horizon: => [0,0,1]
    total_mask = masks[0] | masks[1] | masks[2] | masks[3]
    UV_warped[total_mask] = np.array([[0.0, 0.0, 1.0]])

    # show plot
    X_warped = UV_warped[:,0].reshape((height, width))
    Y_warped = UV_warped[:,1].reshape((height, width))
    gray_img = gray_img[:-1, :-1]

    # add colors
    rgb = img[:,:-1,:].reshape((-1,3)) / 255.0 # we have 1 less faces than grid cells
    rgba = np.concatenate((rgb, np.ones((rgb.shape[0],1))), axis=1)

    plotimg = ax.pcolormesh(X_warped, Y_warped, img.mean(-1)[:,:], cmap='Greys')
    plotimg.set_array(None)
    plotimg.set_edgecolor('none')
    plotimg.set_facecolor(rgba)

ax.set_aspect('equal')
plt.show()

我覺得numpy.meshgrid占用大量內存,但是我不確定。 有人看到我的記憶迅速消失嗎? (順便說一句,我有一台具有12Gb RAM的筆記本電腦,只有一小部分被其他程序使用)

您可能要使用此庫來分析代碼。

它會告訴您腳本在哪里使用內存。

還有一個問題#1 有關內存分析器。 另外,我過去使用此答案中的技巧作為快速了解代碼存儲器中失控位置的方法。 我只是在各處打印resource.getrusage()結果。 它不是很干凈,並且不能總是工作,但是它是標准庫的一部分,很容易做到。

我通常使用profilecProfile模塊進行profile cProfile ,因為它使測試代碼的各個部分變得相當容易。

Python Profilers

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM