大型excel-fi的优化处理

2024-06-16 11:11:06 发布

您现在位置:Python中文网/ 问答频道 /正文

我正在处理一个大型数据集,在那里我需要读取excel文件,然后找到有效的数字,但是这项任务只需要花费大量的时间处理500k个数据。对于有效号码,我使用googlephonelib。处理可以以异步方式完成,因为它们是独立的。在

parts = dask.delayed(pd.read_excel)('500k.xlsx')
data = dd.from_delayed(parts)
data['Valid'] = data['Mobile'].apply(lambda x: phonenumbers.is_valid_number(phonenumbers.parse(x)),meta=('Valid','object'))

作为背景

^{pr2}$

输出为真

我预计输出不到10秒,但需要40秒左右


Tags: 文件数据data方式时间数字exceldask
1条回答
网友
1楼 · 发布于 2024-06-16 11:11:06

你可能只需要^{} your dataframe来允许并行运行计算

我首先生成一些数据:

import csv
import random
with open('tmp.csv', 'w') as fd:
    out = csv.writer(fd)
    out.writerow(['id', 'number'])
    for i in range(500_000):
        a = random.randrange(1000, 2999)
        b = random.randrange(100_000, 899_999)
        out.writerow([i+1, f'+44 {a} {b}'])

请注意,这些大多是有效的英国数字。在

然后我运行与您的代码类似的代码:

^{pr2}$

在我的笔记本电脑(4核,8线程,linux5.2.8)上完成这个过程需要大约20秒,这只是普通循环性能的两倍多一点。这表明dask有相当多的运行时开销,因为我预计它会比这快得多。如果一个cdm{1>调用需要更长的时间来删除一个cdm}

请注意,如果我重写它来执行multiprocessing中的天真操作,我会得到更好的结果:

from multiprocessing import Pool
import pandas as pd

df = pd.read_csv('tmp.csv')

with Pool(4) as pool:
    df['valid'] = pool.map(fn, df['number'])

减少11秒甚至更少的运行时间

相关问题 更多 >