2

Shapefile に含まれるデータを操作する Python コードがあります。

とりわけ、コードはこれを行います:

 xxx=0
 for i in channels:
      ptsi=mat(shapes[i].points)
      xx = ptsi[:,0]
      yy = ptsi[:,1]

      nanx=argwhere(isnan(xx))      
      nany=argwhere(isnan(yy))

      if (nanx == nany and len(nanx) != 0):
          xx[nanx] = []
          yy[nany] = []
      elif (len(nanx) != 0 or len(nany) != 0):
          xx = []
          yy = []

      if (len(xx) > 0):          
       yyy = 0 
       dd = str(i*100/N_channels) + '%\r\r'
      # os.write(1,dd)
       dist = zeros(len(xx)-1)

       dist = dist_min
       for j in channels:
           pts=mat(shapes[j].points)
           xx2 = pts[:,0]
           yy2 = pts[:,1]

           nanx=argwhere(isnan(xx2))          
           nany=argwhere(isnan(yy2))

           if (nanx == nany and len(nanx) != 0):
            xx2[nanx] = []
            yy2[nany] = []
           elif (len(nanx) != 0 or len(nany) != 0):
            xx2 = []
            yy2 = []
           if (len(xx2) > 0):  
            if (i != j): 
               ds = gaa(xx,yy,xx2[0],yy2[0])
               de = gaa(xx,yy,xx2[-1],yy2[-1])
               nande = ~isnan(de)
               nands = ~isnan(ds)
               fe = np.argwhere(de<=dist)
               fs = np.argwhere(ds<=dist)
               nozeroe = array(where(de != 0))
               nozeroe = nozeroe[0]
               nozeros = array(where(ds != 0))
               nozeros = nozeros[0] 
               if(fs.size >0):
                    iis=array(np.argwhere(array(ds==min(ds))))

                    iis = iis.flatten()
                    iis = iis[0]
                    p1 = xxx + iis 
                    p2 = yyy
                    G.add_edge(p2,p1,weight=w_con)

               elif (fe.size > 0):
                    iie=array(np.argwhere(array(de==min(de))))
                    iie = iie.flatten()
                    iie = iie[0]
                    p1 = xxx + iie
                    p2 = yyy  + len(pts) -1
                    G.add_edge(p2,p1,weight=w_con)

           yyy = yyy + len(pts)

      xxx = xxx + len(ptsi)

基本的に、コードはポリラインをスキャンし、最小距離を検索してマージし、共通のグラフに (Networkx を使用して) 作成します。この部分は問題なく動作しますが、10 万を超えるオブジェクトを処理するため、これが非常に遅くなります (現在のバージョンでは約 20 時間かかります)。

これらの組み込みループは効率的ではないため、マルチスレッドの使用が役立つかどうかを知りたいのですが、もしそうなら、コードのこの部分をどのように変更すればよいでしょうか? CUDA または OpenCL が役立つ場合は問題ありません。

フィードバックをお寄せいただきありがとうございます。

4

2 に答える 2

1

Global Interpreter Lockが原因で、Python コードはマルチスレッドを介して複数のコアを完全に利用することができず、複数のコアを完全に利用するにはマルチプロセッシングを使用する必要があります。

于 2012-11-13T03:03:14.527 に答える
0

スレッドを増やしても役に立ちません。より多くのプロセスが必要になるかもしれませんが、CUDA を使用できる場合は、おそらく良い動きになるでしょう。スレッドは、複数のものでプロセスの CPU 時間を共有できるようにするための手段にすぎません。スレッドは、遅いコードを高速化するわけではなく、さらに遅くするだけです。

于 2012-11-13T02:53:46.613 に答える