情景模式:距离变换使用大量内存?

2024-09-30 20:36:47 发布

您现在位置:Python中文网/ 问答频道 /正文

这是我第一次遇到一个使用scipy的代码,特别是这个:https://github.com/milossramek/office-interoperability-tools/blob/master/scripts/docompare.py在我运行它的大部分时间里,它使用了我电脑的所有内存,使得电脑在几分钟内不可用(如果我以前没有杀死它),所以我只是用内存剖析器来剖析它,这就是我看到的:

内部def lineIndexPage(iarray0,iarray1):

310                                     # create arrays with aligned lines
311 1307.492 MiB    0.000 MiB       vh_lines=[] # horizontally aligned lines
312 1307.492 MiB    0.000 MiB       v_lines=[]  # original lines from iarray1
313 1307.492 MiB    0.000 MiB       indices=[]
314 4230.641 MiB 2923.148 MiB       for i in range(min(len(tx0),len(tx1))):
315 1384.742 MiB -2845.898 MiB          l0= GetLine(itrim0, tx0, i)
316 1461.992 MiB   77.250 MiB               l1 = GetLine(itrim1, tx1, i)
317 3286.629 MiB 1824.637 MiB           cline, ind = alignLineIndex(l0, l1)
318 3286.707 MiB    0.078 MiB           vh_lines.append(cline)
319 3286.707 MiB    0.000 MiB           indices.append(ind)
320                                     #cline, ind = alignLineIndex(GetLine(itrim0, tx0, i), GetLine(itrim1, tx1, i), halign=False)
321 4230.410 MiB  943.703 MiB           cline, ind = alignLineIndex(l0, l1, halign=False)
322 4230.633 MiB    0.223 MiB           v_lines.append(cline)
323 4230.691 MiB    0.059 MiB       indices = np.array(indices)

内部定义alignLineIndex(l1,l2,halign=True):

267 3365.109 MiB    0.000 MiB       horizPosErr = 0
268 3365.109 MiB    0.000 MiB           if halign:
269 1510.734 MiB -1854.375 MiB               horizPosErr,l1,l2=align(l1,l2,1)
270                             
271                                 # align in the vertical direction
272 3365.109 MiB 1854.375 MiB           vertPosErr,ll1,ll2=align(l1,l2,0)
273                             
274                                     #overlap index
275 3442.359 MiB   77.250 MiB       diff = ll1 != ll2
276 3442.359 MiB    0.000 MiB           if np.sum(ll2) + np.sum(ll1) == 0:
277                                     ovlapindex = 1.0
278                                     else:
279 3442.359 MiB    0.000 MiB           ovlapindex = 1.0 - float(np.sum(diff)) / (np.sum(ll2) + np.sum(ll1))
280                             
281                             
282 4060.344 MiB  617.984 MiB       ld1 = distancetransf(ll1)
283 4677.141 MiB  616.797 MiB       ld2 = distancetransf(ll2)

和内部def DISTANCETRAFF(图像):

47 4091.801 MiB    0.000 MiB   @profile
48                             def distancetransf(image):
49 4091.801 MiB    0.000 MiB    if image.dtype=='bool':
50                                  return ndimage.distance_transform_edt(1-image.astype(np.int8))
51                                     else:
52 4679.246 MiB  587.445 MiB        return ndimage.distance_transform_edt(1-image)

所以,我的问题是:距离变换是慢的另一个原因吗?如果是这样的话,我如何修改它来提高性能,避免脚本占用所有内存?如前所述,我对scipy完全陌生,不知道如何改进。你知道吗

谢谢


Tags: imagel1npmibsumlinesindindices