Когда используются методы травления коллекций Даска - PullRequest
0 голосов
/ 28 мая 2020

Коллекции Dask предоставляют методы для травления, такие как DataFrame s и Array s . Хотя сами коллекции IIU C работникам не передаются. Вместо этого граф извлекается, оптимизируется и превращается в задачи, которые затем выполняются рабочими (сериализация зависимостей данных, таких как массивы Pandas и NumPy). Итак, в каких случаях на самом деле используются эти методы травления коллекций Dask?

1 Ответ

0 голосов
/ 28 мая 2020

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

Для DataFrames Dask использует pickle, и действительно, большинство вещей используют pickle

In [4]: from distributed.protocol import serialize

In [5]: serialize(pd.DataFrame({'a': [0,1,2]}))
Out[5]:
({'serializer': 'pickle'},
 [b"\x80\x04\x95\xbc\x02\x00\x00\x00\x00\x00\x00\x8c\x11pandas.core.frame\x94\x8c\tDataFrame\x94\x93\x94)\x81\x94}\x94(\x8c\x05_data\x94\x8c\x1epandas.core.internals.managers\x94\x8c\x0cBlockManager\x94\x93\x94)\x81\x94(]\x94(\x8c\x18pandas.core.indexes.base\x94\x8c\n_new_Index\x94\x93\x94h\x0b\x8c\x05Index\x94\x93\x94}\x94(\x8c\x04data\x94\x8c\x15numpy.core.multiarray\x94\x8c\x0c_reconstruct\x94\x93\x94\x8c\x05numpy\x94\x8c\x07ndarray\x94\x93\x94K\x00\x85\x94C\x01b\x94\x87\x94R\x94(K\x01K\x01\x85\x94h\x15\x8c\x05dtype\x94\x93\x94\x8c\x02O8\x94K\x00K\x01\x87\x94R\x94(K\x03\x8c\x01|\x94NNNJ\xff\xff\xff\xffJ\xff\xff\xff\xffK?t\x94b\x89]\x94\x8c\x01a\x94at\x94b\x8c\x04name\x94Nu\x86\x94R\x94h\r\x8c\x19pandas.core.indexes.range\x94\x8c\nRangeIndex\x94\x93\x94}\x94(h'N\x8c\x05start\x94K\x00\x8c\x04stop\x94K\x03\x8c\x04step\x94K\x01u\x86\x94R\x94e]\x94h\x14h\x17K\x00\x85\x94h\x19\x87\x94R\x94(K\x01K\x01K\x03\x86\x94h\x1e\x8c\x02i8\x94K\x00K\x01\x87\x94R\x94(K\x03\x8c\x01<\x94NNNJ\xff\xff\xff\xffJ\xff\xff\xff\xffK\x00t\x94b\x89C\x18\x00\x00\x00\x00\x00\x00\x00\x00\x01\x00\x00\x00\x00\x00\x00\x00\x02\x00\x00\x00\x00\x00\x00\x00\x94t\x94ba]\x94h\rh\x0f}\x94(h\x11h\x14h\x17K\x00\x85\x94h\x19\x87\x94R\x94(K\x01K\x01\x85\x94h!\x89]\x94h%at\x94bh'Nu\x86\x94R\x94a}\x94\x8c\x060.14.1\x94}\x94(\x8c\x04axes\x94h\n\x8c\x06blocks\x94]\x94}\x94(\x8c\x06values\x94h6\x8c\x08mgr_locs\x94\x8c\x08builtins\x94\x8c\x05slice\x94\x93\x94K\x00K\x01K\x01\x87\x94R\x94uaust\x94b\x8c\x04_typ\x94\x8c\tdataframe\x94\x8c\t_metadata\x94]\x94\x8c\x05attrs\x94}\x94ub."])

Для NumPy Dask будет использовать pickle, но ему также нужна дополнительная информация, чтобы ускорить работу и уменьшить количество копий . К счастью, Dask может настраивать сериализаторы для определенных c типов данных

In [8]: serialize(np.arange(5))
Out[8]:
({'dtype': (0, '<i8'),
  'shape': (5,),
  'strides': (8,),
  'lengths': [40],
  'type': 'numpy.ndarray',
  'type-serialized': b'\x80\x04\x95\x15\x00\x00\x00\x00\x00\x00\x00\x8c\x05numpy\x94\x8c\x07ndarray\x94\x93\x94.',
  'serializer': 'dask'},
 [<memory at 0x118d942c0>])

Я бы рекомендовал прочитать https://distributed.dask.org/en/latest/serialization.html, чтобы узнать подробности Dask о сериализации или посмотреть через https://github.com/dask/distributed/blob/master/distributed/protocol/ для получения подробной информации о коде реализации сериализации

...