我有多個使用python Pandas庫處理的數據文件。每個文件都被逐一處理,並且當我查看任務管理器時,只有一個邏輯處理器被使用(它在〜95%,其餘在5%以內)使用多個內核同時處理多個數據文件
有沒有辦法同時處理數據文件? 如果是這樣,有沒有辦法利用其他邏輯處理器來做到這一點?
(編輯歡迎)
我有多個使用python Pandas庫處理的數據文件。每個文件都被逐一處理,並且當我查看任務管理器時,只有一個邏輯處理器被使用(它在〜95%,其餘在5%以內)使用多個內核同時處理多個數據文件
有沒有辦法同時處理數據文件? 如果是這樣,有沒有辦法利用其他邏輯處理器來做到這一點?
(編輯歡迎)
您可以處理在不同的線程或者不同進程中不同的文件。
蟒蛇的好處是,它的框架提供的工具,你要做到這一點:
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
這裏:
快速注意:它看起來像Python線程不會使用多個核心,根據:http://stackoverflow.com/questions/7542957/is-python-capable-of-running-on-多內核。不過,'multiprocessing'庫會使用它。 – phss
偉大的信息,感謝您分享! – KimKulling
@KimKulling,坦克你的代碼和額外的鏈接:) –
如果你的文件名列表中,你可以使用此代碼:
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()
看看'concurrent.futures.ProcessPoolExecutor' - 同樣的想法,但仔細地插手,並與角落案件等 - https:// docs .python.org/3/library/concurrent.futures.html – jsbueno
謝謝!但是,不幸的是,它似乎不適用於Python 2.7 ... – Diego
Python 2.7現在已經有七年了 - 它在發佈時已經有點老了,因爲Python 3已經成熟了。 OP沒有提到他在使用Python2。 (當然,一個建議concurrent.futures的答案不得不提到它只是Python 3) – jsbueno
[關於併發視頻的思考](https://www.youtube.com/watch?v=Bv25Dwe84g0) – wwii
看看[multipro cessing.pool](https://docs.python.org/3/library/multiprocessing.html#module-multiprocessing.pool) – swenzel
@swenzel擊敗了我。打算輸入確切的東西 –