拆分数据框,使线程处理每个部分,然后合并数据框

时间:2019-06-15 10:20:58

标签: python python-3.x multithreading threadpool

描述:我已经有一个顺序的和线程化的python代码了。通常,对于数据帧中的每一行,循环都会遍历该数据帧,以将2个单元格组合为1个字符串,处理组合后的字符串并返回结果。

问题:整个过程非常缓慢(我认为可能需要4到10天),我想将数据帧分为4个或更多部分,以使线程处理每个部分。我尝试制作线程,但是在使用较小的数据帧进行测试后没有提高性能。简单/顺序脚本的总时间为30秒,线程在35秒内完成,这意味着线程较慢而不是较快。

问题:如何加快速度?

我尝试过的事情 顺序方法-成功运行但执行缓慢: 在一个简单的循环中,结果存储在单独的数据框中并另存为.csv。

线程方法-运行成功,但执行速度更慢: 我试图将数据框分成多个部分并创建线程。每个线程在赋予它的部分上工作。然后将结果提取并合并到最终数据框中,并另存为.csv。

队列(线程)方法-未执行: 我也尝试使用queue()进行编码,但是我距离成功执行还差很远。我显然需要更多地研究这个主题。会更快并且值得尝试吗?

#code with threads
import pandas as pd
import numpy as np

def myfunction(myvar): 
    if len(myvar) > 256: 
        return False
    return True

def mythread(df, resultdf):
    for index, x in df.iterrows():
        for index2, y in data.iterrows():
            if ( x['mycol'][:1] != y['mycol'][:1] ):
                combined=x['mycol']+""+y['mycol']
                if(myfunction(combined)):
                    resultdf = resultdf.append({'mycol': combined}, ignore_index=True)
    return resultdf


#Start of main
data=pd.read_csv('data/small.csv')
combined_from_threads = pd.DataFrame(columns=['mycol'])

df1,df2,df3,df4=np.array_split(data, 4)
resultdf = pd.DataFrame(columns=['mycol'])

from multiprocessing.pool import ThreadPool
pool = ThreadPool(processes=4)

async_result1 = pool.apply_async(mythread, (df1, resultdf)) 
async_result2 = pool.apply_async(mythread, (df2, resultdf)) 
async_result3 = pool.apply_async(mythread, (df3, resultdf)) 
async_result4 = pool.apply_async(mythread, (df4, resultdf)) 
return1 = async_result1.get()
return2 = async_result2.get()
return3 = async_result3.get()
return4 = async_result4.get()

combined_from_threads = pd.concat([return1, return2, return3, return4], axis = 0, sort=True)
combined_from_threads.to_csv('result_threads.csv',index = False)
#sequential - simple
data=pd.read_csv('data/small.csv')
resultdf = pd.DataFrame(columns=['mycol'])

for index, x in data.iterrows():
    print(str(index)+") "+x['mycol'])
    for index2, y in data.iterrows():
        if ( x['mycol'][:1] != y['mycol'][:1] ):
            combined=x['mycol']+""+y['mycol']
            #print(combined)
            if(myfunction(combined)):
                #print(combined+" found!")
                resultdf = resultdf.append({'mycol': combined}, ignore_index=True)

resultdf.to_csv('result_sequential.csv',index = False)

在顺序方法中,我的一个CPU核心使用率峰值接近100%,而其他cpu核心处于空闲状态。执行时间(大致平均):30秒

在线程方法中,所有cpu核心使用率都达到25%,然后坐在那里直到python完成。以我的理解,由于创建的线程,它应该显示更高的用法,以使python代码更快地完成。执行时间(大致平均):35秒,但不超过10秒

0 个答案:

没有答案