Python并行数据处理
我们有一个数据集,大约有1.5MM行。我想同时处理这个问题。该代码的主要功能是查找主信息并丰富1.5MM行。主数据集是一个两列数据集,大约有25000行。但是,我无法使多进程正常工作并正确测试其可伸缩性。能找个人帮忙吗。代码的简化版本如下所示Python并行数据处理,python,parallel-processing,Python,Parallel Processing,我们有一个数据集,大约有1.5MM行。我想同时处理这个问题。该代码的主要功能是查找主信息并丰富1.5MM行。主数据集是一个两列数据集,大约有25000行。但是,我无法使多进程正常工作并正确测试其可伸缩性。能找个人帮忙吗。代码的简化版本如下所示 import pandas from multiprocessing import Pool def work(data): mylist =[] #Business Logic return mylist.append(data
import pandas
from multiprocessing import Pool
def work(data):
mylist =[]
#Business Logic
return mylist.append(data)
if __name__ == '__main__':
data_df = pandas.read_csv('D:\\retail\\customer_sales_parallel.csv',header='infer')
print('Source Data :', data_df)
agents = 2
chunksize = 2
with Pool(processes=agents) as pool:
result = pool.map(func=work, iterable= data_df, chunksize=20)
pool.close()
pool.join()
print('Result :', result)
CUSTOMER_ID,PRODUCT_ID,SALE_QTY
641996,115089,2
1078894,78144,1
1078894,121664,1
1078894,26467,1
457347,59359,2
1006860,36329,2
1006860,65237,2
1006860,121189,2
825486,78151,2
825486,78151,2
123445,115089,4
方法work
将具有业务逻辑,我希望将分区数据传递到work
以启用并行处理。样本数据如下所示
import pandas
from multiprocessing import Pool
def work(data):
mylist =[]
#Business Logic
return mylist.append(data)
if __name__ == '__main__':
data_df = pandas.read_csv('D:\\retail\\customer_sales_parallel.csv',header='infer')
print('Source Data :', data_df)
agents = 2
chunksize = 2
with Pool(processes=agents) as pool:
result = pool.map(func=work, iterable= data_df, chunksize=20)
pool.close()
pool.join()
print('Result :', result)
CUSTOMER_ID,PRODUCT_ID,SALE_QTY
641996,115089,2
1078894,78144,1
1078894,121664,1
1078894,26467,1
457347,59359,2
1006860,36329,2
1006860,65237,2
1006860,121189,2
825486,78151,2
825486,78151,2
123445,115089,4
理想情况下,我希望在每个分区中处理6行
请帮忙
谢谢和问候
Bala我的最佳建议是使用read_csv()中的chunksize参数并进行迭代。这样,您就不会在尝试加载所有内容时使ram崩溃,并且如果您愿意,您可以使用它来加速进程
for i,chunk in enumerate(pd.read_csv('bigfile.csv', chunksize=500000)):
我不确定这是否能回答您的具体问题,但我希望能有所帮助。首先,
work
返回mylist.append(data)
的输出,即None
。我假设(如果不是,我建议)您想要返回一个处理过的数据帧
要分配负载,可以使用numpy.array\u split
将大型数据帧拆分为6行数据帧列表,然后由work
处理
import pandas
import math
import numpy as np
from multiprocessing import Pool
def work(data):
#Business Logic
return data # Return it as a Dataframe
if __name__ == '__main__':
data_df = pandas.read_csv('D:\\retail\\customer_sales_parallel.csv',header='infer')
print('Source Data :', data_df)
agents = 2
rows_per_workload = 6
num_loads = math.ceil(data_df.shape[0]/float(rows_per_workload))
split_df = np.array_split(data_df, num_loads) # A list of Dataframes
with Pool(processes=agents) as pool:
result = pool.map(func=work, iterable=split_df)
result = pandas.concat(result) # Stitch them back together
pool.close()
pool.join()pool = Pool(processes=agents)
print('Result :', result)
不幸的是,由于GIL,我怀疑使用Python线程会加快进程。多进程是Python中使用并行性的唯一“真正”方法。@marco Typekazt感谢您的回复。我想要多进程而不是多线程please@BalajiKrishnanyou have this docs:which我不知道,但据我所知,它与线程非常相似(至少在外部),为什么要将数据帧传递给涉及附加到列表的多处理?您没有提供足够的信息来正确回答这个问题,但是您可能会加入数据源或合并数据源。它也会比多重处理快。谢谢你的详细回复。我当然想返回一个数据帧。将尝试您在此处列出的代码和我的业务逻辑。再次感谢你,没有问题!如果你满意,请接受答案:)非常感谢,这几乎解决了我的问题。请只回答一个简单的后续问题,
work
方法采用两个参数,如work(master,data)
我如何才能轻松打包这是一个更常见的问题;例如,见。我想看看pool.starmap
。非常感谢。让我看看。