我有使用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)))
答案 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)