为Pandas使用多个核心

时间:2016-03-08 08:10:31

标签: python python-2.7 pandas

我有使用Pandas的以下Python(2.7)函数,我需要在400 GB上运行。 在150 GB上运行测试需要4个小时才能成功完成(机器上的内存为128 GB,16个内核,4TB磁盘)。 有没有一种智能的方法来利用我的CPU上的所有核心 并行执行此操作以减少处理时间:

def create_data(headers, filters, filesFolder, remove_chars, outputFolder):
for ds in headers:
    for data_file in glob.glob(filesFolder + '*' + ds + '*.csv'):
        x=0
        for data in pd.read_csv(data_file, sep = '€', names = headers[ds], engine = 'python', chunksize = 10000000):
            logger.info('Pandas Read %s' %(str(x) + '_' + os.path.basename(data_file)) )
            for fil in filters[ds]:
                try:
                    data[fil] = data[fil].astype('O')
                    data = data[data[fil] == filters[ds][fil]]
                    logger.info('Filtered data for %s succesfully. Filters are %s' %(str(x) + '_' + os.path.basename(data_file) , filters[ds]))
                except:
                    logger.info('Could not apply filter %s for %s' %(filters[ds][fil], str(x) + '_' + os.path.basename(data_file) ))
                    pass
            for char in remove_chars:   
                try:
                    data = data.replace({char: ''}, regex=True)
                    logger.info('Removed char %s from %s succesfully' %(char, str(x) + '_' + os.path.basename(data_file) ))
                except:
                    logger.info('Could not remove char %s from %s' %(char, str(x) + '_' + os.path.basename(data_file) ))
                    pass
            try:
                data.to_csv(outputFolder + ds + '/' + str(x) + '_' + os.path.basename(data_file).split('.')[0].strip() + '.csv', enconding = 'utf-8')
                logger.info('Saved csv %s succesfully' %(str(x) + '_' + os.path.basename(data_file)))
                x+=1
            except:
                logger.info('Failed to Save %s' %(str(x) + '_' + os.path.basename(data_file)))

2 个答案:

答案 0 :(得分:3)

我经常遇到这个问题。我发现最快捷的方法就是混合使用GNU Parallel,Python和Click

假设您的标题和文件名是2个文件,headers.txt,

header_1
header_2
header_3
header_4

和files.txt

file_1
file_2
file_3
file_4
file_5

以下Python脚本是一个简单的CLI实用程序,它接受一个标头和一个文件,并对它们执行某些操作:

import click

cli = click.Group()

@cli.command()
@click.option(
    '-h',
    '--header',
    type=str
)
@click.option(
    '-f',
    '--file',
    type=str
    # type=click.File()
)
def create(header, file):
    # Do stuff with header and file
    print header, file 


if __name__ == '__main__':

    cli()

以下parallel命令将针对标头和文件的每个组合在所有核心上运行脚本:

parallel python example.py create -h {1} -f {2} :::: headers.txt :::: files.txt

输出结果为:

header_1 file_1
header_1 file_2
header_1 file_4
header_1 file_3
header_1 file_5
header_2 file_1
header_2 file_2
header_2 file_3
header_2 file_5
header_2 file_4
header_3 file_1
header_3 file_2
header_3 file_3
header_3 file_4
header_3 file_5
header_4 file_2
header_4 file_1
header_4 file_3
header_4 file_4
header_4 file_5

答案 1 :(得分:0)

这是一个较旧的问题。但是现在,使用Modin可能是最简单的方法。

只需安装并更改您的

import pandas as pd

import modin.pandas as pd