Параллельно обрабатывать огромный список

Когда вы вызываете

cutoff(x) <- 65

, вы фактически вызываете

x <- "cutoff<-"(x = x, value = 65)

Имя функции должно быть указано как синтаксически действительное, но нестандартное имя и синтаксический анализатор интерпретируют <- как оператор не как часть имени функции, если он не был указан.

"cutoff<-"() подобен любой другой функции (хотя и с странным именем); он меняет свой входной аргумент на основе value (в этом случае он устанавливает любое значение в x больше, чем 65 на Inf (бесконечное)).

магия действительно выполняется, когда вы вызываете функцию, подобную этой

cutoff(x) <- 65

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

В более общем плане мы имеем

FUN(obj) <- value

R находит функцию "FUN<-"() и устанавливает вызов, передавая obj и value в "FUN<-"() , а упорядочивает результат "FUN<-"(), который будет назначен на obj, поэтому он вызывает:

obj <- "FUN<-"(obj, value)

Полезной ссылкой для этой информации является раздел определения языка g0] R 3.4.4: Назначение подмножества ; дискуссия немного наклонная, но, по-видимому, она является самой официальной ссылкой (функции замены упоминаются в распространении часто задаваемых вопросов R (различия между R и S-PLUS) и в справочной системе R (различные технические проблемы), но я не нашел дальнейшего обсуждения в официальной документации).

0
задан Roger Santos 7 March 2019 в 14:55
поделиться

1 ответ

Создать набор партий, а затем создать задачу для каждого элемента в пакете, выполняющего работу (параллельно)

async Task Main()
{
    var batchSize = 10;
    var batches = logins.Select((item, inx) => new { item, inx })
                    .GroupBy(x => x.inx / batchSize)
                    .Select(g => g.Select(x => x.item));

    foreach (var batch in batches)
    {
        var tasks = new List<Task>(batchSize);
        foreach (var login  in batch)
        {
            tasks.Add(DoWork());
        }
        await Task.WhenAll(tasks);
    }
}

public async Task DoWork()
{
    if (await _serviceLoginInjected.LogIn(login))
    {
        await _serviceLoginInjected.SendEmails();
        await _serviceLoginInjected.CreateFiles();
        await _serviceLoginInjected.DoSomethingElse();
    }
}
0
ответ дан Magnus 7 March 2019 в 14:55
поделиться
Другие вопросы по тегам:

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