Доступ к одному элементу в большом опубликованном массиве с помощью Dask

Есть ли более быстрый способ получить только один элемент в большом опубликованном массиве с помощью Dask без получения всего массива?

В приведенном ниже примере client.get_dataset ('array1') [0] занимает примерно то же время, что и client.get_dataset ('array1').

import distributed
client = distributed.Client()
data = [1]*10000000
payload = {'array1': data}
client.publish(**payload)

one_element = client.get_dataset('array1')[0]

person sudouser2010    schedule 20.07.2017    source источник


Ответы (1)


Обратите внимание, что все, что вы публикуете, отправляется планировщику, а не рабочим, поэтому это несколько неэффективно. Publish был предназначен для использования с коллекциями Dask, такими как dask.array.

Клиент 1

import dask.array as da
x = da.ones(10000000, chunks=(100000,))  # 1e7 size array cut into 1e5 size chunks
x = x.persist()  # persist array on the workers of the cluster

client.publish(x=x)  # store the metadata of x on the scheduler

Клиент 2

x = client.get_dataset('x')  # get the lazy collection x
x[0].compute()  # this selection happens on the worker, only the result comes down
person MRocklin    schedule 20.07.2017
comment
Я хотел бы отметить этот вопрос как завершенный, но когда я запускаю этот фрагмент кода, используя предложенный подход, он зависает в [0] .compute (). Фактический фрагмент кода, который я использую, см. По ссылке ниже: stackoverflow.com/questions/45468673/ - person sudouser2010; 02.08.2017
comment
Мне удалось заставить опубликованный вами фрагмент кода работать. Чтобы заставить его работать, я должен был убедиться, что рабочие были также созданы для планировщика b / c в моей версии. Для всех остальных, см. Мою ссылку выше для получения дополнительной информации. - person sudouser2010; 03.08.2017