为 Pandas 使用多个核心

Men*_*kes 5 python python-2.7 pandas

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

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

PGl*_*ivi 6

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

只需安装它并更改您的

import pandas as pd
Run Code Online (Sandbox Code Playgroud)

import modin.pandas as pd
Run Code Online (Sandbox Code Playgroud)


laf*_*ras 4

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

假设您的标头和文件名位于 2 个文件中,headers.txt,

header_1
header_2
header_3
header_4
Run Code Online (Sandbox Code Playgroud)

和文件.txt

file_1
file_2
file_3
file_4
file_5
Run Code Online (Sandbox Code Playgroud)

以下 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()
Run Code Online (Sandbox Code Playgroud)

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

parallel python example.py create -h {1} -f {2} :::: headers.txt :::: files.txt
Run Code Online (Sandbox Code Playgroud)

输出是:

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
Run Code Online (Sandbox Code Playgroud)