Параллельная обработка в kdb - PullRequest
3 голосов
/ 24 июня 2019

Когда мы используем -s, основной поток делегирует некоторую работу подчиненным потокам.

Я выполняю код ниже в сеансе с 3 подчиненными потоками: q -s 3

select from t where date within 2019.01.18 2019.01.20

Попытка понять, как q использовала потоки внутренне для вышеуказанного запроса.
Использует ли kdb внутренне каждый дочерний поток для извлечения данных за дату, а затем основной поток объединяет данные в конце?
что-то вроде:

main thread looking for slave threads and assigning work
    slave 1:  t1: select from t where date within 2019.01.18
    slave 2:  t2: select from t where date within 2019.01.19
    slave 3:  t3: select from t where date within 2019.01.20
    main thread: t1,t2,t3

Какую работу выполняет каждый подчиненный поток и какую работу выполняет основной поток?

Ответы [ 3 ]

3 голосов
/ 24 июня 2019

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

В вашем конкретном случае, еслиТаблица, из которой вы запрашиваете, разделена, тогда запрос будет эффективно распараллелен.Поскольку он будет вытягивать все столбцы, запрос будет привязан к вводу / выводу, что означает, что вы не увидите большого / какого-либо ускорения.

1 голос
/ 24 июня 2019

попробуйте это {выберите из t, где date = x} персик (дата, где дата в 2019.01.18 2019.01.20)

это должно быть быстрее

1 голос
/ 24 июня 2019

Если ваша таблица сегментирована и вы используете несколько потоков, то разделы будут обрабатываться параллельно. Больше деталей: https://code.kx.com/q4m3/14_Introduction_to_Kdb+/#1442-segmentation-vs-partitions а также https://code.kx.com/v2/kb/partition/

...