Проблемы с использованием dask, распространяемого с помощью datashader: 'не удается обработать объекты weakref' - PullRequest
1 голос
/ 19 июня 2020

Я работаю с datashader и dask, но у меня возникают проблемы при построении графика с работающим кластером. Чтобы сделать его более конкретным, у меня есть следующий пример (встроенный в график боке):

import holoviews as hv
import pandas as pd
import dask.dataframe as dd
import numpy as np
from holoviews.operation.datashader import datashade
import datashader.transfer_functions as tf

#initialize the client/cluster
cluster = LocalCluster(n_workers=4, threads_per_worker=1)
dask_client = Client(cluster)


def datashade_plot():
    hv.extension('bokeh')
    #create some random data (in the actual code this is a parquet file with millions of rows, this is just an example)
    delta = 1/1000
    x = np.arange(0, 1, delta)
    y = np.cumsum(np.sqrt(delta)*np.random.normal(size=len(x)))
    df = pd.DataFrame({'X':x, 'Y':y})

    #create dask dataframe
    points_dd = dd.from_pandas(df, npartitions=3)

    #create  plot
    points = hv.Curve(points_dd)
    return  hd.datashade(points)

dask_client.submit(datashade_plot,).result()

Это вызывает:

TypeError: can't pickle weakref objects

У меня есть теория, что это происходит потому, что вы не может распределять операции обмена данными в кластере. Извините, если это вопрос новичков, я был бы очень признателен за любой совет, который вы могли бы мне дать.

1 Ответ

2 голосов
/ 19 июня 2020

Думаю, вы хотите go наоборот. То есть передать datashader фрейм данных dask вместо pandas dataframe:

>>> from dask import dataframe as dd
>>> import multiprocessing as mp
>>> dask_df = dd.from_pandas(df, npartitions=mp.cpu_count())
>>> dask_df.persist()
...
>>> cvs = datashader.Canvas(...)
>>> agg = cvs.points(dask_df, ...)

XREF: https://datashader.org/user_guide/Performance.html

...