Получить данные из БД документов, используя многопоточность / параллельность - PullRequest
0 голосов
/ 10 марта 2020

У меня есть JSON документы в БД документов (~ 30 тыс. Документов), где каждый документ имеет уникальный идентификатор, например, AA123, AA124. Существует инструмент, который мы используем для извлечения этих документов из БД документов, где для каждого вызова GET-запроса установлено ограничение в 500 документов. Так что это должно go через 60 раз запросить GET для получения результата, который занимает некоторое время. Я стремлюсь оптимизировать этот процесс для быстрого выполнения этого (параллельного запуска потоков), чтобы я мог быстро получать данные. Ниже приведен пример кода того, как я извлекаю данные из БД на данный момент.

private int maxItemsPerCall = 500;

public override async Task<IEnumerable<docClass>> Getdocuments()
{
    string accessToken = "token";
    SearchResponse<docClass> docs = await db.SearchDocuments<docClass>(initialload, accessToken); //Gets top 500

    List<docClass> routeRules = new List<docClass>();
    routeRules.AddRange(docs.Documents);

    var remainingCalls = (docs.TotalDocuments / maxItemsPerCall);

    while (remainingCalls > 0 && docs.TotalDocuments > maxItemsPerSearch)
    {
        docs = await db.SearchDocuments<docClass>(GetFollowUp(docs.Documents.LastOrDefault().Id.Id), requestOptions);
        routeRules.AddRange(docs.Documents);
        remainingCalls--;
    }
    return routeRules;
}    

private static SearchRequest initialload = new SearchRequest()
{
    Filter = new SearchFilterGroup(
                new[]
                {
                    new SearchFilter(Field.Type, FilterOperation.Equal, "documentRule")
                },
                GroupOperator.And),
    OrderBy = Field.Id,
    Top = maxItemsPerCall,
    Descending = false
};

private static SearchRequest GetFollowUp(string lastId)
{
    SearchRequest followUpRequest = new SearchRequest()
    {
        Filter = new SearchFilterGroup(
                new[] {
                    new SearchFilter(Field.Type, FilterOperation.Equal, "documentRule"),
                    new SearchFilter(Field.Id, FilterOperation.GreaterThan, lastId)
                },
                GroupOperator.And),
        OrderBy = Field.Id,
        Top = maxItemsPerCall,
    };
    return followUpRequest;
}  

Требуется помощь: поскольку я использую каждый запрос GET (500 документов на основе идентификаторов в зависимости от идентификатора предыдущий запуск), как я могу использовать для параллельного запуска (по крайней мере 5 параллельных потоков за раз) выборки 500 записей на поток (то есть 2500 параллельных в общей сложности для 5 потоков одновременно). Я не знаком с потоками, поэтому было бы полезно, если бы кто-то мог подсказать, как это сделать.

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