Чтение нескольких (CERN) ROOT-файлов в массив NumPy - используя n узлов и, скажем, 2n графических процессоров - PullRequest
0 голосов
/ 15 февраля 2019

Я читаю много (скажем, 1k) файлов CERN ROOT, используя цикл и сохраняю некоторые данные во вложенном массиве NumPy.Использование циклов делает это последовательной задачей, и каждому файлу требуется некоторое время для завершения процесса.Поскольку я работаю над моделью глубокого обучения, я должен создать достаточно большой набор данных - но само время чтения занимает очень много времени (чтение 835 событий занимает около 21 минуты).Кто-нибудь может подсказать, возможно ли использовать несколько графических процессоров для чтения данных, чтобы для чтения потребовалось меньше времени?Если да, то как?

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

https://github.com/Kolahal/SupervisedCounting/blob/master/read_n_train.py

Я запускаю программу как:

python read_n_train.py <input-file-list>

, где аргумент представляет собой текстовый файл, содержащий списокфайлов с адресами.Я открывал ROOT файлы в цикле в функции read_data_into_list().Но, как я уже говорил, эта последовательная задача отнимает много времени.Мало того, я заметил, что скорость чтения ухудшается, когда мы читаем все больше и больше данных.

Тем временем я пытался использовать пакет slurmpy https://github.com/brentp/slurmpy С этим я могу распределить работу в:скажем, N рабочих узлов, например.В этом случае отдельная программа чтения прочитает назначенный ей файл и вернет соответствующий список.Просто в конце мне нужно добавить списки.Я не мог найти способ сделать это.

Любая помощь высоко ценится.

С уважением, Колахал

1 Ответ

0 голосов
/ 18 февраля 2019

Вы последовательно проходите все события из python, что, вероятно, является узким местом.

Вы можете заглянуть в root_numpy , чтобы загрузить необходимые данные из корневого файла в массивы numpy.:

root_numpy - это модуль расширения Python, который обеспечивает эффективный интерфейс между ROOT и NumPy.Внутренние элементы root_numpy скомпилированы в C ++ и, следовательно, могут обрабатывать большие объемы данных намного быстрее, чем эквивалентные чистые реализации Python.

В настоящее время я также смотрю на root_pandas , который кажется похожим.

Хотя это решение не дает точного ответа на запрос распараллеливания, оно может сделать распараллеливание ненужным.И если он все еще слишком медленный, то он все еще может быть использован параллельно, используя slurm или что-то еще.

...