无法腌制 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:

  1. 我添加了一个 "file_name" 字符串(这是在我查看数据集之前 dict 并看到它已经有一个文件名 - doh
  2. 一个新的 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。