Не могу мариновать набор данных pydicom и не знаю почему - PullRequest
0 голосов
/ 20 сентября 2019

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

Это вопрос, относящийся к pydicom - япопытался сначала опубликовать свой список рассылки google, но по какой-то причине сервер списка не работал - так что извините за публикацию здесь.

Я нахожусь на anaconda с последними обновлениями через conda (python 3.7.4, последний pydicom, macos)


У меня есть прога среднего размера, я пишу, что все отлично работает (6000 строк), и теперь я пытаюсь использовать multiprocessing дляускорить это.Прога читает в исследовании, группирует его по сериям, а затем запускает набор тестов для каждой серии - так хорошо подходит для этого.

У меня все работает без проблем, когда я запускаю некоторые процессы с набором вызовов multiprocessing.Process().Я получил свои серии изображений в виде списка pydicom Dataset, и я передаю этот список моей функции test_series() с парой других параметров, ... все без проблем.

Но я просто пытался переключиться на использование multiprocessing.Pool() вместо этого для удобства и облегчения доступа к возвращаемым значениям из моей функции test_series () (вместо использования очередей или каналов).


Однако pool.starmap() вызвано в моем списке Dataset's не удалось, потому что список не может быть рассортирован (в частности, каждый набор данных в списке не является).Мои знания Python до сих пор не очень помогают мне понять, почему, однако.

Я попытался диагностировать его, а) пытаясь pickle на наборе данных , как только он прочитан издиск - проблем нет, в этом случае он будет хорошо мариноваться.б) используя 'get_unpicklable' из stackoverflow , чтобы увидеть, что именно в наборе данных вызывает проблему.Когда я запускаю его на одном из моих наборов данных, я получаю следующее сообщение:

"[key type=DataElement]._value.type_constructor (Type 'function' caused: Can't pickle local object 'DataElement._convert_value.<locals>.<lambda>')",

"[val type=DataElement]._value.type_constructor (Type 'function' caused: Can't pickle local object 'DataElement._convert_value.<locals>.<lambda>')"

В своем коде я добавляю два атрибута - просто: <var>.file_name = new_value:

  1. Я добавляюстрока «file_name» (это было до того, как я посмотрел на набор данных dict и увидел, что у него уже есть имя файла - doh
  2. Новый массив данных пикселей _scaled_pixel_data, который является _scaled_pixel_array, увеличенным вsize (я увеличил размер в 4 раза для своей обработки)

(PS - я не переклассифицировал набор данных pydicom, так как я новичок в python, и было быстрее добавить егоатрибуты вручную)

Нет проблем где-либо еще, а также нет проблем, когда я вызываю multiprocessing.Process (), передавая мой список в качестве аргумента - проблема возникает только при попытке использовать pool.starmap ()

Кто-нибудь знает, что случилось?

Должен ли я повторно классифицировать набор данных pydicom с двумя новыми атрибутами, а не просто добавлять атрибуты вручную?

спасибоза любую помощь! Ричард

1 Ответ

2 голосов
/ 21 сентября 2019

Лямбда-функции не могут быть выбраны, это было указано в выпуске 951 , и в настоящее время ведется работа.

В качестве комментария о списке рассылки (группа Google)), это модерируемый список для новых участников - вы должны были получить сообщение для ожидания модерации.

...