2

私は画像を切り取って保存する簡単なコードを書いています。
しかし、問題は、画像の数が約150,000以上であり、速度を向上させたいということです。
Pythonマルチプロセッシング - 速度向上のためにワークロードを分割するにはどうすればよいですか?

だから、最初に私は、次のように、forループシンプルなコードを書いた:

import cv2 
import numpy 
import sys 

textfile=sys.argv[1] 
file_list=open(textfile) 
files=file_list.read().split('\n') 
idx=0 
for eachfile in files: 
    image=cv2.imread(eachfile) 
    idx+=1 
    if image is None: 
     pass 
    outName=eachfile.replace('/data','/changed_data') 
    if image.shape[0]==256: 
     image1=image[120:170,120:170] 
    elif image.shape[0]==50: 
     image1=image 
    cv2.imwrite(outName,image1) 
    print idx,outName 

このコードは、90000のイメージに約38秒かかりました。 しかし、デュアルコアを使用すると、単一のプロセスより時間がかかりました。同じ90000のイメージでは約48秒でした。

import cv2 
import sys 
import numpy 
from multiprocessing import Pool 

def crop(eachfile): 
    image=cv2.imread(eachfile) 
    idx+=1 
    if image is None: 
     pass 
    outName=eachfile.replace('/data','/changed_data') 
    if image.shape[0]==256: 
     image1=image[120:170,120:170] 
    elif image.shape[0]==50: 
     image1=image 
    cv2.imwrite(outName,image1) 
    print idx,outName 


if __name__=='__main__': 
    textfile=sys.argv[1] 
    file_list=open(textfile) 
    files=file_list.read().split('\n') 
    pool=Pool(2) 
    pool.map(crop,files) 

私はプロセスをスピードアップするために正しいことをしていますか?または、リストを分割して各リストをプロセスに送信する必要がありますか?

私のコードはすばらしいと思いますか?

ありがとうございます!!!

+0

btw、プログラムは\ n文字で区切られたファイルでテキストファイルを読み込んでいます。 – user103192

答えて

0

本当に2つのコアでタスクを分割する必要があります。このサンプルコード "やや修正された"で遊んでください。 OPはhereです。あなたの画像を提供するフックであるdataが見えます。 multiprocessingを使用している場合、defsはクラスの下で動作しません...あなたがpathosを使用しようとすると、あなたはcPickleから最新の2.7バージョンでいくつかの問題が発生します。 3.5などでは発生しません。楽しい!

import multiprocessing 

def mp_worker((inputs, the_time)): 
    print " Process %s\tWaiting %s seconds" % (inputs, the_time) 
    time.sleep(int(the_time)) 
    print " Process %s\tDONE" % inputs 
    sys.stdout.flush() 

def mp_handler():       # Non tandem pair processing 
    p = multiprocessing.Pool(2) 
    p.map(mp_worker, data) 

def mp_handler_tandem(): 
    subdata = zip(data[0::2], data[1::2]) 
# print subdata 
    for task1, task2 in subdata: 
     p = multiprocessing.Pool(2) 
     p.map(mp_worker, (task1, task2)) 

#data = (['a', '1'], ['b', '2'], ['c', '3'], ['d', '4']) 
data = (['a', '2'], ['b', '3'], ['c', '1'], ['d', '4'], 
     ['e', '1'], ['f', '2'], ['g', '3'], ['h', '4']) 

if __name__ == '__main__': 
    sys.stdout.flush() 
# print 'mp_handler():' 
# mp_handler() 
# print '---' 
# time.sleep(2) 

# print '\nmp_handler_tandem():' 
# mp_handler_tandem() 
    print '---' 
# time.sleep(2) 

    Multiprocess().qmp_handler() 

エディタ内での作業:それが起こる中に画面にあなたの出力をフラッシュするsys.stdout.flush()を使用しています。

ただし、カーネルと分割ジョブを使用してhereもチェックしてください。

関連する問題