Каковы хорошие практики при написании сценариев Python с тяжелым дисковым вводом / выводом (numpy load)? - PullRequest
0 голосов
/ 19 сентября 2019

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

В частности, для одного примера обучения необходимо загрузить 6 связанных сохраненных numpy массивов разных размеров (от 100 КБ до 6 МБ в формате .npy).В результате, когда в наборе данных имеется 10 тыс. Обучающих примеров, количество загружаемых файлов составляет 60 тыс.

После загрузки массивов с использованием tuple(np.load(item) for item in all_files) мне нужно выполнить три numpy операции, которыеявляются:

  1. vstack, для кортежа состоит из 10 тыс. массивов с формой (1000, 92, 50).
  2. concatenate, для кортежа состоит из 10 тыс. массивовразличной длины.
  3. Применение расширенного среза к векторизованным кортежам массивов numpy.

При тестировании сценария я обнаружил проблему: объем памяти в buff/cache можетбыть в 2 раза больше памяти used (я запускал скрипт на кластере slurm, каждый вычислительный узел имеет 128 ГБ памяти), в результате, когда я достигну третьего шага, я получу ошибку памяти.

В ответ на этот ответ я использую отдельный сценарий (в конце этого сценария добавляю sys.exit()) для loading + vectorizing массивов numpy, сохраняя при этом шаг advanced slicing в оригинальном сценарии.

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

Есть ли лучшие решения?Для чего используется большая память в buff/cache, когда я загружаю массивы numpy, используя tuple(np.load(item) for item in all_files)?Каковы хорошие практики при написании сценария с тяжелыми операциями numpy.load?

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...