Я пытаюсь открыть файл 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()
Размер файла набора данных составляет 35 ГБ, а на моей машине 32 ГБ оперативной памяти, и я подумал, что ограничение потоков на одного работника может решить проблему, но я не был слишком уверен.
Я удалил параметр для запроса потоков в исходном коде, но он по-прежнему возвращает ту же ошибку: 1. Использование неуправляемой памяти велико, 2. Рабочий процесс nanny.memory слишком медленный для завершения, 3. Будущее исключение никогда не получено, 4. Ошибка разрешения: доступ запрещен.
Не могли бы вы проверить после вызова read_json, сколько разделов имеет ваш объект df?
Объект df имеет один раздел
Итак, здесь происходит следующее: вы пытаетесь загрузить файл в один раздел, а этот файл слишком велик, чтобы поместиться в памяти одного рабочего процесса.
Если файл представляет собой данные в формате 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%.
Он делает это постоянно, и иногда работника убивают за то, что он снова и снова отказывается от вычислительной задачи.
Ну, это зависит от ваших вычислений, вы не должны получить эту ошибку, просто вычислив сумму. Это происходит, когда Worker пытается или вынужден загрузить слишком много разделов в свою память.
Привет, какой размер твоего файла? Сколько памяти у вас на компьютере? Зачем вы просите 200 тем?? Последнее может быть единственной причиной вашей проблемы, поскольку каждый поток пытается загрузить часть данных.