在Python中使用多程序快速處理資料

2021-08-13 10:36:41 字數 2440 閱讀 5044

資料分片:可以將資料分片處理的任務適合用多程序**處理,核心思路是將data分片,對每一片資料處理返回結果(可能是無序的),然後合併。應用場景:多程序爬蟲,類mapreduce任務。缺點是子程序會拷貝父程序所有狀態,記憶體浪費嚴重。

import math

from multiprocessing import pool

def run(data, index, size): # data 傳入資料,index 資料分片索引,size程序數

size = math.ceil(len(data) / size)

start = size * index

end = (index + 1) * size if (index + 1) * size < len(data) else len(data)

temp_data = data[start:end]

# do something

return data # 可以返回資料,在後面收集起來

processor = 40

res =

p = pool(processor)

for i in range(processor):

print(str(i) + ' processor started !')

p.close()

p.join()

for i in res:

print(i.get()) # 使用get獲得多程序處理的結果

分檔案處理:當記憶體受限時,不能再繼續使用資料分片,因為子程序會拷貝父程序的所有狀態,導致記憶體的浪費。這時候可以考慮先把大檔案分片儲存到磁碟,然後del 釋放掉資料,接著在多程序處理的函式裡面分別讀取,這樣子程序就會分別讀取需要處理的資料,而不會占用大量記憶體。

from multiprocessing import pool

import pandas as pd

import math

data=pd.dataframe()

users=pd.dataframe(data['user_id'].unique(),columns=['user_id'])

processor=4

p=pool(processor)

l_data = len(users)

size = math.ceil(l_data / processor)

res =

def run(i):

data=pd.read_csv('../data/user_'+str(i)+'.csv')

#todo

return data

for i in range(processor):

start = size * i

end = (i + 1) * size if (i + 1) * size < l_data else l_data

user = users[start:end]

t_data = pd.merge(data, user, on='user_id').reset_index(drop=true)

t_data.to_csv('../data/user_'+str(i)+'.csv',index=false)

print(len(t_data))

del data,l_data,users

for i in range(processor):

print(str(i) + ' processor started !')

p.close()

p.join()

data = pd.concat([i.get() for i in res])

多程序資料共享:當需要修改共享的資料時,那麼這個時候可以使用資料共享:

from multiprocessing import process, manager

# 每個子程序執行的函式

# 引數中,傳遞了乙個用於多程序之間資料共享的特殊字典

def func(i, d):

d[i] = i + 100

print(d.values())

# 在主程序中建立特殊字典

m = manager()

d = m.dict()

for i in range(5):

# 讓子程序去修改主程序的特殊字典

p = process(target=func, args=(i, d))

p.start()

p.join()

------------

[100]

[100, 101]

[100, 101, 102, 103]

[100, 101, 102, 103]

[100, 101, 102, 103, 104]

python使用多程序

python多執行緒適合io密集型場景,而在cpu密集型場景,並不能充分利用多核cpu,而協程本質基於執行緒,同樣不能充分發揮多核的優勢。針對計算密集型場景需要使用多程序,python的multiprocessing與threading模組非常相似,支援用程序池的方式批量建立子程序。只需要例項化pr...

python多程序 python多程序

當有多個非相關任務需要處理時,並行能大大提高處理速度。這裡簡要介紹python的multiprocessing模組。簡單多程序編寫 當我們任務數量確定而且比較少的時候,可以手動為每個任務指定乙個程序來執行。import multiprocessing as mp def f a print a if...

python多程序 Python多程序實踐

建立程序方式如下 可以通過lock鎖機制實現共享鎖,但比較常用的方式還是以上這些方式,效率更高,更安全。使用方式 構造 類方法 使用方式 構造 更多型別支援一般使用manager,支援的型別包括list,dict,namespace,lock,rlock,semaphore,boundedsemap...