python - 如何用大字典映射 dask 系列
问题描述
我正在尝试找出使用大型映射映射 dask 系列的最佳方法。直接的series.map(large_mapping)
问题UserWarning: Large object of size <X> MB detected in task graph
和建议使用client.scatter
andclient.submit
但后者并不能解决问题,实际上它要慢得多。尝试也无济于事broadcast=True
。client.scatter
import argparse
import distributed
import dask.dataframe as dd
import numpy as np
import pandas as pd
def compute(s_size, m_size, npartitions, scatter, broadcast, missing_percent=0.1, seed=1):
np.random.seed(seed)
mapping = dict(zip(np.arange(m_size), np.random.random(size=m_size)))
ps = pd.Series(np.random.randint((1 + missing_percent) * m_size, size=s_size))
ds = dd.from_pandas(ps, npartitions=npartitions)
if scatter:
mapping_futures = client.scatter(mapping, broadcast=broadcast)
future = client.submit(ds.map, mapping_futures)
return future.result()
else:
return ds.map(mapping)
if __name__ == '__main__':
parser = argparse.ArgumentParser()
parser.add_argument('-s', default=200000, type=int, help='series size')
parser.add_argument('-m', default=50000, type=int, help='mapping size')
parser.add_argument('-p', default=10, type=int, help='partitions number')
parser.add_argument('--scatter', action='store_true', help='Scatter mapping')
parser.add_argument('--broadcast', action='store_true', help='Broadcast mapping')
args = parser.parse_args()
client = distributed.Client()
ds = compute(args.s, args.m, args.p, args.scatter, args.broadcast)
print(ds.compute().describe())
解决方案
你的问题在这里
In [4]: mapping = dict(zip(np.arange(50000), np.random.random(size=50000)))
In [5]: import pickle
In [6]: %time len(pickle.dumps(mapping))
CPU times: user 2.24 s, sys: 18.6 ms, total: 2.26 s
Wall time: 2.25 s
Out[6]: 6268809
所以mapping
是大且未分区的 - 分散操作是在这种情况下给您带来问题的操作。
考虑替代方案
def make_mapping():
return dict(zip(np.arange(50000), np.random.random(size=50000)))
mapping = client.submit(make_mapping) # ships the function, not the data
# and requires no serialisation
future = client.submit(ds.map, mapping)
这不会显示警告。但是,在这里使用字典来做映射对我来说似乎很奇怪,一系列直列数组似乎更好地编码了数据的性质。
推荐阅读
- visual-studio-code - VSCode:如何禁用特定文件的静态分析?
- swift - 无法为测试目标定义资源
- php - 如何使用 php 为 fcfs 时间表绘制甘特图?
- r - 闪亮的用户上传 csv selectinput 从数据框中输入一列以进行进一步计算
- pine-script - 结合两种不同的金字塔策略
- python - 使用 for 循环在子图中绘制箱线图
- entity-framework - EF 核心具有相同外键的多个虚拟属性
- numpy - 如何用 numpy 向量化 out[i] = a[i+1] - a[i-1]?
- statistics - 如何确定 2 个度量变量的相关性?
- c# - 如何在 C# .Net 中使用 TcpClient 和 TcpListener 连接同一服务器上的多个客户端