如何在巨大的数据帧上实现并行处理
How to implement parallel process on huge dataframe
现在,我有一个巨大的数据框"all_in_one",
all_in_one.info()
<class 'pandas.core.frame.DataFrame'>
RangeIndex: 8271066 entries, 0 to 8271065
Data columns (total 3 columns):
label int64
text object
type int64
dtypes: int64(2), object(1)
memory usage: 189.3+ MB
all_in_one.sample(2)
我需要在此数据框的 "text" 列上 运行 分词。
import jieba
import re
def jieba_cut(text):
text_cut = list(filter(lambda x: re.match("\w", x),
jieba.cut(text)))
return text_cut
%%time
all_in_one['seg_text'] = all_in_one.apply(lambda x:jieba_cut(x['text']),axis = 1)
CPU times: user 1h 18min 14s, sys: 55.3 s, total: 1h 19min 10s
Wall time: 1h 19min 10s
这个过程总共耗时1个多小时。我想在数据帧上并行执行分词并减少 运行ning 时间。请留言。
编辑:
太棒了,当我用 dask 实现上面的功能时。
all_in_one_dd = dd.from_pandas(all_in_one, npartitions=10)
%%time
all_in_one_dd.head()
CPU times: user 4min 10s, sys: 2.98 s, total: 4min 13s
Wall time: 4min 13s
如果您正在使用 pandas 并希望进行某种形式的并行处理,我建议您使用 dask
。这是一个 Python 包,与 pandas
数据帧具有相同的 API,因此在您的示例中,如果您有一个名为 file.csv
的 csv 文件,您可以执行以下操作:
您必须为 dask Client 做一些设置,并告诉它您想要多少个 worker 以及要使用多少个内核。
import dask.dataframe as dd
from dask.distributed import Client
import jieba
def jieba_cut(text):
text_cut = list(filter(lambda x: re.match("\w", x),
jieba.cut(text)))
return text_cut
client = Client() # by default, it creates the same no. of workers as cores on your local machine
all_in_one = dd.read_csv('file.csv') # This has almost the same kwargs as a pandas.read_csv
all_in_one = all_in_one.apply(jieba_cut) # This will create a process map
all_in_one = all_in_one.compute() # This will execute all the processes
有趣的是,您实际上可以访问仪表板来查看 dask 完成的所有流程(我认为默认情况下是 localhost:8787
)
现在,我有一个巨大的数据框"all_in_one",
all_in_one.info()
<class 'pandas.core.frame.DataFrame'>
RangeIndex: 8271066 entries, 0 to 8271065
Data columns (total 3 columns):
label int64
text object
type int64
dtypes: int64(2), object(1)
memory usage: 189.3+ MB
all_in_one.sample(2)
我需要在此数据框的 "text" 列上 运行 分词。
import jieba
import re
def jieba_cut(text):
text_cut = list(filter(lambda x: re.match("\w", x),
jieba.cut(text)))
return text_cut
%%time
all_in_one['seg_text'] = all_in_one.apply(lambda x:jieba_cut(x['text']),axis = 1)
CPU times: user 1h 18min 14s, sys: 55.3 s, total: 1h 19min 10s
Wall time: 1h 19min 10s
这个过程总共耗时1个多小时。我想在数据帧上并行执行分词并减少 运行ning 时间。请留言。
编辑:
太棒了,当我用 dask 实现上面的功能时。
all_in_one_dd = dd.from_pandas(all_in_one, npartitions=10)
%%time
all_in_one_dd.head()
CPU times: user 4min 10s, sys: 2.98 s, total: 4min 13s
Wall time: 4min 13s
如果您正在使用 pandas 并希望进行某种形式的并行处理,我建议您使用 dask
。这是一个 Python 包,与 pandas
数据帧具有相同的 API,因此在您的示例中,如果您有一个名为 file.csv
的 csv 文件,您可以执行以下操作:
您必须为 dask Client 做一些设置,并告诉它您想要多少个 worker 以及要使用多少个内核。
import dask.dataframe as dd
from dask.distributed import Client
import jieba
def jieba_cut(text):
text_cut = list(filter(lambda x: re.match("\w", x),
jieba.cut(text)))
return text_cut
client = Client() # by default, it creates the same no. of workers as cores on your local machine
all_in_one = dd.read_csv('file.csv') # This has almost the same kwargs as a pandas.read_csv
all_in_one = all_in_one.apply(jieba_cut) # This will create a process map
all_in_one = all_in_one.compute() # This will execute all the processes
有趣的是,您实际上可以访问仪表板来查看 dask 完成的所有流程(我认为默认情况下是 localhost:8787
)