2015-07-06 27 views
3

我需要加載約100k文件與載體和聚合內容在一個numpy數組。這個過程大約需要3分鐘,所以我想加快速度。我試圖用gevent來加速它,但我無法獲得任何加速。沒有加速讀取文件與gevent

我讀到應該使用異步調用來加速IO調用而不是多處理。我進一步閱讀gevent是推薦的圖書館。我寫了一個例子來下載圖片,我可以看到速度的巨大提高。這裏是我的代碼

def chunks(l, n): 
    """ Yield successive n-sized chunks from l. 
    """ 
    for i in xrange(0, len(l), n): 
     yield l[i:i+n] 

file_paths = # list of filenames 
numpy_array = numpy.ones([len(file_paths), file_size]) 
pool = gevent.pool.Pool(poolsize) 
for i, list_file_path_tuples in enumerate(chunks(file_paths, CHUNK_SIZE)): 
    gevent_results = pool.map(numpy.load, list_file_path_tuples) 
    pool.join() 
    for i_chunk, result in enumerate(gevent_results): 
     index = i * CHUNK_SIZE + i_chunk 
     data = result['arr_0'] 
     numpy_array[index] = data 

使用塊是必要的簡化版本,否則我會所有的載體兩次在內存中。

在我的代碼中存在問題還是使用錯誤的方法?

回答

4

你是否分析了你的代碼,並且知道熱點在哪裏?如果不是計算,那可能只是磁盤IO。我懷疑你會因IO邏輯技巧而獲得性能提升。最後,順序磁盤訪問可能是限制。如果你有一個RAID系統,從磁盤讀取多個線程可能是有意義的,但你可以用python標準線程來完成。嘗試從1增加到幾個,並沿途測量以找到最佳點。

您看到gevent下載圖像並行改進的原因是,網絡IO吞吐量可以通過多個連接改善很多。當遠程服務器沒有直接連接到網絡設備時,單個網絡連接幾乎不能使網絡帶寬飽和。而單個磁盤IO操作可以輕鬆飽和磁盤吞吐量。