2017-01-16 87 views
1

我有多個使用python Pandas庫處理的數據文件。每個文件都被逐一處理,並且當我查看任務管理器時,只有一個邏輯處理器被使用(它在〜95%,其餘在5%以內)使用多個內核同時處理多個數據文件

有沒有辦法同時處理數據文件? 如果是這樣,有沒有辦法利用其他邏輯處理器來做到這一點?

(編輯歡迎)

+0

[關於併發視頻的思考](https://www.youtube.com/watch?v=Bv25Dwe84g0) – wwii

+1

看看[multipro cessing.pool](https://docs.python.org/3/library/multiprocessing.html#module-multiprocessing.pool) – swenzel

+0

@swenzel擊敗了我。打算輸入確切的東西 –

回答

0

您可以處理在不同的線程或者不同進程中不同的文件。

蟒蛇的好處是,它的框架提供的工具,你要做到這一點:

from multiprocessing import Process 

def process_panda(filename): 
    # this function will be started in a different process 
    process_panda_import() 
    write_results() 

if __name__ == '__main__': 
    p1 = Process(target=process_panda, args=('file1',)) 
    # start process 1 
    p1.start() 
    p2 = Process(target=process_panda, args=('file2',)) 
    # starts process 2 
    p2.start() 
    # waits if process 2 is finished 
    p2.join() 
    # waits if process 1 is finished 
    p1.join() 

程序將啓動2子流程,可以用來做處理您的文件。 你可以使用線程做類似的工作。

您可以在這裏找到的文檔: https://docs.python.org/2/library/multiprocessing.html

這裏:

https://pymotw.com/2/threading/

+2

快速注意:它看起來像Python線程不會使用多個核心,根據:http://stackoverflow.com/questions/7542957/is-python-capable-of-running-on-多內核。不過,'multiprocessing'庫會使用它。 – phss

+0

偉大的信息,感謝您分享! – KimKulling

+1

@KimKulling,坦克你的代碼和額外的鏈接:) –

0

如果你的文件名列表中,你可以使用此代碼:

from multiprocessing import Process 

def YourCode(filename, otherdata): 
    # Do your stuff 

if __name__ == '__main__': 
    #Post process files in parallel 
    ListOfFilenames = ['file1','file2', ..., 'file1000'] 
    ListOfProcesses = [] 
    Processors = 20 # n of processors you want to use 
    #Divide the list of files in 'n of processors' Parts 
    Parts = [ListOfFilenames[i:i + Processors] for i in xrange(0, len(ListOfFilenames), Processors)] 

    for part in Parts: 
     for f in part: 
      p = multiprocessing.Process(target=YourCode, args=(f, otherdata)) 
      p.start() 
      ListOfProcesses.append(p) 
     for p in ListOfProcesses: 
      p.join() 
+2

看看'concurrent.futures.ProcessPoolExecutor' - 同樣的想法,但仔細地插手,並與角落案件等 - https:// docs .python.org/3/library/concurrent.futures.html – jsbueno

+0

謝謝!但是,不幸的是,它似乎不適用於Python 2.7 ... – Diego

+0

Python 2.7現在已經有七年了 - 它在發佈時已經有點老了,因爲Python 3已經成熟了。 OP沒有提到他在使用Python2。 (當然,一個建議concurrent.futures的答案不得不提到它只是Python 3) – jsbueno