Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/python/358.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Python并行数据处理_Python_Parallel Processing - Fatal编程技术网

Python并行数据处理

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

我们有一个数据集,大约有1.5MM行。我想同时处理这个问题。该代码的主要功能是查找主信息并丰富1.5MM行。主数据集是一个两列数据集,大约有25000行。但是,我无法使多进程正常工作并正确测试其可伸缩性。能找个人帮忙吗。代码的简化版本如下所示

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
。非常感谢。让我看看。