Nano Hash - криптовалюты, майнинг, программирование

Рассчитать сумму символов параллельно

У меня есть массив строк. Я хотел бы подсчитать общее количество символов, но используя потоки для распараллеливания (исходная проблема не в этом, а похожа).

use std::thread;

pub fn frequency<'a>(input: &'a [&'a str], worker_count: usize) -> usize {
    let handlers: Vec<thread::JoinHandle<usize>> = input
        .chunks(worker_count)
        .map(|chunk| thread::spawn(calculate(chunk)))
        .collect();

    let hashes = handlers.into_iter().map(|handler| handler.join().unwrap());

    let mut sum = 0;
    for h in hashes {
        sum += h
    }

    sum
}

fn calculate<'a>(input: &'a [&'a str]) -> impl Fn() -> usize + 'a {
    move || input.iter().map(|s| s.len()).sum()
}

Компилятор говорит мне следующее:

error[E0495]: cannot infer an appropriate lifetime for autoref due to conflicting requirements
 --> src/lib.rs:5:10
  |
5 |         .chunks(worker_count)
  |          ^^^^^^
  |
note: first, the lifetime cannot outlive the lifetime 'a as defined on the function body at 3:18...
 --> src/lib.rs:3:18
  |
3 | pub fn frequency<'a>(input: &'a [&'a str], worker_count: usize) -> usize {
  |                  ^^
note: ...so that reference does not outlive borrowed content
 --> src/lib.rs:4:52
  |
4 |     let handlers: Vec<thread::JoinHandle<usize>> = input
  |                                                    ^^^^^
  = note: but, the lifetime must be valid for the static lifetime...
note: ...so that the type `impl std::ops::Fn<()>` will meet its required lifetime bounds
 --> src/lib.rs:6:22
  |
6 |         .map(|chunk| thread::spawn(calculate(chunk)))
  |                      ^^^^^^^^^^^^^

Я пытался удалить все времена жизни, использовать разные времена жизни для str и среза и явно вызывать calculate::<'a>, но ни одно из этих решений не компилируется.

Время жизни ввода везде одинаковое: frequency объявляет 'a, которое используется в calculate, поэтому замыкание привязано к 'a, потому что захваченные переменные живут 'a.

Где я не прав?

NB: я бы не хотел использовать 'static.



Новые материалы

Кластеризация: более глубокий взгляд
Кластеризация — это метод обучения без учителя, в котором мы пытаемся найти группы в наборе данных на основе некоторых известных или неизвестных свойств, которые могут существовать. Независимо от..

Как написать эффективное резюме
Предложения по дизайну и макету, чтобы представить себя профессионально Вам не позвонили на собеседование после того, как вы несколько раз подали заявку на работу своей мечты? У вас может..

Частный метод Python: улучшение инкапсуляции и безопасности
Введение Python — универсальный и мощный язык программирования, известный своей простотой и удобством использования. Одной из ключевых особенностей, отличающих Python от других языков, является..

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

Работа с векторными символическими архитектурами, часть 4 (искусственный интеллект)
Hyperseed: неконтролируемое обучение с векторными символическими архитектурами (arXiv) Автор: Евгений Осипов , Сачин Кахавала , Диланта Хапутантри , Тимал Кемпития , Дасвин Де Сильва ,..

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

Обеспечение масштабируемости LLM: облачный анализ с помощью AWS Fargate и Copilot
В динамичной области искусственного интеллекта все большее распространение получают модели больших языков (LLM). Они жизненно важны для различных приложений, таких как интеллектуальные..