Существует ли способ мультираспараллелить SqlDataReader?

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

Кроме того, он может быть заключен в языки сценариев, такие как Autoit с DllCall

7
задан Martin 27 May 2009 в 13:45
поделиться

3 ответа

Настройте очередь производителя / потребителя с одним процессом производителя, который будет извлекать из считывающего устройства и помещать записи в очередь как можно быстрее, но без «обработки». Затем какое-то другое количество процессов (сколько вам нужно, зависит от вашей системы) для удаления из очереди и обработки каждой записи в очереди.

6
ответ дан 7 December 2019 в 05:30
поделиться

Это простой запрос с диапазоном значений, например WHERE Id от 1 до 500000? Если это так, вы можете просто запустить N запросов, каждый из которых возвращает 1 / N диапазона. Но при использовании однопоточного подхода полезно знать, где вы находитесь в узком месте. Если вы выполняете непрерывное чтение с одного дискового шпинделя для выполнения запроса, вам, вероятно, следует придерживаться одного потока. Если он разделен между шпинделями по некоторому диапазону, вы можете разумно настроить свои запросы, чтобы максимизировать пропускную способность с диска (то есть читать с каждого диска параллельно с отдельными запросами). Если вы ожидаете, что все строки будут в памяти, вы можете распараллелить их по своему желанию. Но если запрос более сложный, вы не сможете легко разбить его без больших накладных расходов. В большинстве случаев указанные выше параметры не будут применяться должным образом, и производитель / потребитель, упомянутый Джоэлом, будет единственным местом для параллелизации. В зависимости от того, сколько времени вы тратите на обработку каждой строки, это может дать лишь незначительную выгоду.

-1
ответ дан 7 December 2019 в 05:30
поделиться

Вы не должны читать столько строк на client.

При этом вы можете разделить свой запрос на несколько запросов и выполнять их параллельно. Это означает, что запускайте несколько команд SqlCommand в отдельных потоках и заставляйте их перемешивать каждый раздел результата. Вопрос A + состоит в том, как разделить результат, и это во многом зависит от ваших данных и вашего запроса:

  1. Вы можете использовать диапазон ключей (например, ID между 1 и 10000 , ID между 10001 и 20000 и т. д.)
  2. Вы можете использовать атрибут (например, RecordTypeID IN (1,2) , RecordTypeID IN (3,
3
ответ дан 7 December 2019 в 05:30
поделиться
Другие вопросы по тегам:

Похожие вопросы: