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\ndef 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)))\nRun Code Online (Sandbox Code Playgroud)\n
这是一个较老的问题。但现在,使用Modin可能是最简单的方法。
只需安装它并更改您的
import pandas as pd
Run Code Online (Sandbox Code Playgroud)
到
import modin.pandas as pd
Run Code Online (Sandbox Code Playgroud)
我经常遇到这个问题。我发现最快的方法是混合使用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)