无法腌制 pydicom 数据集并且不确定为什么
Can't pickle a pydicom Dataset and not sure why
我遇到一个问题,其中 pydicom 数据集列表(即 dicom 图像)不可挑选,我不确定为什么。
这是一个特定于 pydicom 的问题 - 我首先尝试发布到他们的 google 邮件列表,但由于某种原因列表服务器出现故障 - 所以请原谅我在这里发布它。
我在 anaconda 上,最新的一切都是通过 conda 更新的(python 3.7.4,最新的 pydicom,macos)
我有一个中等大小的程序,我正在写它一切正常(6,000 行),现在我正尝试使用 multiprocessing
来加速它。 prog 阅读一项研究,将其按系列分组,然后 运行 对每个系列进行一组测试 - 非常适合。
当我使用一组 multiprocessing.Process()
调用启动一些进程时,我的工作没有任何问题。我有我的系列图像作为 pydicom Dataset
的列表,我将该列表传递给我的 test_series()
函数,还有几个其他参数,...都没有任何问题。
但我只是想改用 multiprocessing.Pool()
,为了方便和更轻松地从我的 test_series() 函数访问 return 值(而不是使用队列或管道)。
但是,在我的 Dataset's
列表中调用的 pool.starmap()
失败了,因为该列表不可 pickle'able(具体来说,列表中的每个数据集都不能)。然而,到目前为止,我对 python 的了解并没有帮助我找出原因。
我试过通过
a) 从磁盘 上读取数据集 后立即尝试 pickle
- 没问题,在这种情况下它会很好地腌制。
b) 使用 中的“get_unpicklable
”来查看导致问题的数据集中的内容。当我 运行 它在我的一个数据集上时,我得到以下报告:
"[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
:
- 我添加了一个 "file_name" 字符串(这是在我查看数据集之前
dict 并看到它已经有一个文件名 - doh
- 一个新的 numpy 像素数据数组 _scaled_pixel_data,这是
_scaled_pixel_array 尺寸放大(我将尺寸增加了 4 倍以进行处理)
(PS - 我没有重新 class pydicom 数据集,因为我是 python 的新手,而且手动添加属性更快)
在其他任何地方都没有问题,当我调用 multiprocessing.Process() 将我的列表作为参数传递时也没有问题 - 只有在尝试使用 pool.starmap()[=22= 时才会出现问题]
有谁知道发生了什么事吗?
我是否应该用两个新属性重新classed pydicom 数据集而不是简单地手动添加属性?
感谢您的帮助!
理查德
无法对 Lambda 函数进行 pickle,这已在 issue 951 中指出,目前正在处理中。
顺便说一句,关于邮件列表(google 组)的评论,它是新成员的审核列表 - 您应该已经收到一条等待审核的消息。
这个问题与 pydicom 1.3.0 有关,当他们更改从 dict
派生 pydicom.Dataset
时。
请参阅以下问题:
https://github.com/pydicom/pydicom/issues/947
一个修复已合并到 2019 年 9 月的主版本中。
您可以在 master 分支上使用最新版本或降级到 1.2.2,等待 1.3.1。
我遇到一个问题,其中 pydicom 数据集列表(即 dicom 图像)不可挑选,我不确定为什么。
这是一个特定于 pydicom 的问题 - 我首先尝试发布到他们的 google 邮件列表,但由于某种原因列表服务器出现故障 - 所以请原谅我在这里发布它。
我在 anaconda 上,最新的一切都是通过 conda 更新的(python 3.7.4,最新的 pydicom,macos)
我有一个中等大小的程序,我正在写它一切正常(6,000 行),现在我正尝试使用 multiprocessing
来加速它。 prog 阅读一项研究,将其按系列分组,然后 运行 对每个系列进行一组测试 - 非常适合。
当我使用一组 multiprocessing.Process()
调用启动一些进程时,我的工作没有任何问题。我有我的系列图像作为 pydicom Dataset
的列表,我将该列表传递给我的 test_series()
函数,还有几个其他参数,...都没有任何问题。
但我只是想改用 multiprocessing.Pool()
,为了方便和更轻松地从我的 test_series() 函数访问 return 值(而不是使用队列或管道)。
但是,在我的 Dataset's
列表中调用的 pool.starmap()
失败了,因为该列表不可 pickle'able(具体来说,列表中的每个数据集都不能)。然而,到目前为止,我对 python 的了解并没有帮助我找出原因。
我试过通过
a) 从磁盘 上读取数据集 后立即尝试 pickle
- 没问题,在这种情况下它会很好地腌制。
b) 使用 get_unpicklable
”来查看导致问题的数据集中的内容。当我 运行 它在我的一个数据集上时,我得到以下报告:
"[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
:
- 我添加了一个 "file_name" 字符串(这是在我查看数据集之前 dict 并看到它已经有一个文件名 - doh
- 一个新的 numpy 像素数据数组 _scaled_pixel_data,这是 _scaled_pixel_array 尺寸放大(我将尺寸增加了 4 倍以进行处理)
(PS - 我没有重新 class pydicom 数据集,因为我是 python 的新手,而且手动添加属性更快)
在其他任何地方都没有问题,当我调用 multiprocessing.Process() 将我的列表作为参数传递时也没有问题 - 只有在尝试使用 pool.starmap()[=22= 时才会出现问题]
有谁知道发生了什么事吗?
我是否应该用两个新属性重新classed pydicom 数据集而不是简单地手动添加属性?
感谢您的帮助! 理查德
无法对 Lambda 函数进行 pickle,这已在 issue 951 中指出,目前正在处理中。
顺便说一句,关于邮件列表(google 组)的评论,它是新成员的审核列表 - 您应该已经收到一条等待审核的消息。
这个问题与 pydicom 1.3.0 有关,当他们更改从 dict
派生 pydicom.Dataset
时。
请参阅以下问题:
https://github.com/pydicom/pydicom/issues/947
一个修复已合并到 2019 年 9 月的主版本中。 您可以在 master 分支上使用最新版本或降级到 1.2.2,等待 1.3.1。