Ошибка памяти Dask Nanny — работник слишком медленно завершает работу

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

Я попытался задать чат-gpt и просмотреть документацию в поисках ответов, но не смог найти журналы рабочих или какую-либо информацию о том, как решить проблему, но безрезультатно, единственное предложение, которое я видел, - это отключить няню, но я решил, что это будет Это не очень хорошая идея, так как, должно быть, что-то в корне не так с моим кодом, поэтому я обратился к переполнению стека за ответами, потому что я заблудился.

Выходной терминал(1)Выходной терминал(2)

from dask.distributed import LocalCluster
import dask.dataframe as dd
from multiprocessing import freeze_support

if __name__ == '__main__':
    freeze_support()
    cluster = LocalCluster(n_workers=2,processes=True,threads_per_worker=200)          
    client = cluster.get_client()

    df = dd.read_json("merged_en.jsonl")
    df.x.sum().compute()
    client.close()
    cluster.close()

Привет, какой размер твоего файла? Сколько памяти у вас на компьютере? Зачем вы просите 200 тем?? Последнее может быть единственной причиной вашей проблемы, поскольку каждый поток пытается загрузить часть данных.

Guillaume EB 11.04.2024 10:55

Размер файла набора данных составляет 35 ГБ, а на моей машине 32 ГБ оперативной памяти, и я подумал, что ограничение потоков на одного работника может решить проблему, но я не был слишком уверен.

Dareal 11.04.2024 15:48

Я удалил параметр для запроса потоков в исходном коде, но он по-прежнему возвращает ту же ошибку: 1. Использование неуправляемой памяти велико, 2. Рабочий процесс nanny.memory слишком медленный для завершения, 3. Будущее исключение никогда не получено, 4. Ошибка разрешения: доступ запрещен.

Dareal 12.04.2024 14:22

Не могли бы вы проверить после вызова read_json, сколько разделов имеет ваш объект df?

Guillaume EB 26.04.2024 16:17

Объект df имеет один раздел

Dareal 30.04.2024 16:59
Почему в Python есть оператор "pass"?
Почему в Python есть оператор "pass"?
Оператор pass в Python - это простая концепция, которую могут быстро освоить даже новички без опыта программирования.
Некоторые методы, о которых вы не знали, что они существуют в Python
Некоторые методы, о которых вы не знали, что они существуют в Python
Python - самый известный и самый простой в изучении язык в наши дни. Имея широкий спектр применения в области машинного обучения, Data Science,...
Основы Python Часть I
Основы Python Часть I
Вы когда-нибудь задумывались, почему в программах на Python вы видите приведенный ниже код?
LeetCode - 1579. Удаление максимального числа ребер для сохранения полной проходимости графа
LeetCode - 1579. Удаление максимального числа ребер для сохранения полной проходимости графа
Алиса и Боб имеют неориентированный граф из n узлов и трех типов ребер:
Оптимизация кода с помощью тернарного оператора Python
Оптимизация кода с помощью тернарного оператора Python
И последнее, что мы хотели бы показать вам, прежде чем двигаться дальше, это
Советы по эффективной веб-разработке с помощью Python
Советы по эффективной веб-разработке с помощью Python
Как веб-разработчик, Python может стать мощным инструментом для создания эффективных и масштабируемых веб-приложений.
0
5
83
1
Перейти к ответу Данный вопрос помечен как решенный

Ответы 1

Ответ принят как подходящий

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

Если файл представляет собой данные в формате JSON (как и следовало ожидать, учитывая расширение jsonl), вам следует использовать lines kwarg и указать blocksize:

df = dd.read_json("merged_en.jsonl", lines=True, blocksize = "128 MiB")

Дополнительную информацию см. в документации .

Спасибо за ваш ответ, который решил проблему, но я просто хотел еще раз уточнить у вас, нормально ли это в терминале при использовании dask, распределенного по большому набору данных ------------------ -----------------------------------------‌​------ --------------‌ -------------- 2024-05-02 22:52:23,733 - распределенный.worker.memory - ПРЕДУПРЕЖДЕНИЕ - Рабочий используется 82% памяти. Пауза работника. Память процесса: 13,10 ГиБ - Предел рабочей памяти: 15,92 ГиБ 02.05.2024 22:52:25,663 - распределенный.worker.memory - ПРЕДУПРЕЖДЕНИЕ - Рабочий объем составляет 58%.

Dareal 02.05.2024 23:53

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

Dareal 02.05.2024 23:54

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

Guillaume EB 03.05.2024 10:13

Другие вопросы по теме