我正在寻找在集群上并行化以下问题的最佳方法。我有几个文件
相对于我要用来分组的public List<HRVacantionUser> listVacantionGoogleUsers(List<GoogleUser> allGoogleUsers){
LocalDate date = LocalDate.now();
List<HRVacantionUser> collect = allGoogleUsers.stream()
.map(user ->
new HRVacantionUser(user.getPrimaryEmail(), date, date.plusDays(ThreadLocalRandom.current().nextInt(1, 5))))
.collect(toList());
return collect;
,它们是不相交的,也就是说,如果key
中有一组键,则这些键中的任何一个在任何其他文件中都有一个项。
我可以一边跑
file1.csv
但是我想知道是否存在一种更好/更智能的方式来实现 delayed-groupby方式。
每个df = dd.read_csv("folder/*")
df.groupby("key").apply(f, meta=meta).compute(scheduler='processes')
都适合节点上的内存。假设每个节点都具有filexxx.csv
个核心,则最好使用所有这些核心。对于每个文件,我都可以使用这种hacky方式
n
再说一次,我不确定是否有有效的方法。
答案 0 :(得分:-1)
您可以使用Client
(默认情况下将在多进程中运行)并使用特定的blocksize
读取数据。您可以使用ncores
方法获得工作人员数量(以及每个工作人员的核心数量),然后计算出最佳的blocksize
。
但是根据documantaion blocksize
,默认情况下是“根据可用的物理内存和内核数进行计算”。
所以我认为做到这一点的最佳方法很简单:
from distributed import Client
# if you run on a single machine just do: client = Client()
client = Client('cluster_scheduler_path')
ddf = dd.read_csv("folder/*")
编辑:之后,使用map_partitions
并对每个分区执行gorupby:
# Note ddf is a dask dataframe and df is a pandas dataframe
new_ddf = ddf.map_partitions(lambda df: df.groupby("key").apply(f), meta=meta)
不要使用compute
,因为它会产生一个pandas.dataframe
,而是使用dask
output方法来使整个过程保持并行,更大,然后与ram兼容。