# 数据集加载-GeneratorDataset卡住、卡死

MindSpore可以自定义Python数据源，通过迭代该数据源构造数据集。有点类似PyTorch的DataLoader。

相关的API可以参考：[mindspore.dataset.GeneratorDataset](https://www.mindspore.cn/docs/api/zh-CN/master/api_python/dataset/mindspore.dataset.GeneratorDataset.html#mindspore.dataset.GeneratorDataset)

自定义GeneratorDataset处理数据集时，混用numpy.ndarray  和 mindspore.Tensor 的操作会出现卡死

GeneratorDataset接口自定义的数据集，脚本如下：

![](figures/1.png)

**1. 原因分析**：

猜测在自定义的数据处理中，存在numpy.ndarray -\> mindspore.Tensor -\> numpy.ndarray的混用过程，并且错误地使用numpy.array\(Tensor\)做转换，导致GIL锁得不到释放，GeneratorDataset不能正常工作。

打印堆栈分析后证明这个猜想，堆栈：

![](figures/2.png)

这个堆栈可以用py-spy这个工具获得，主要是为了看每一个进程目前运行的所在位置（神器啊！！！）

GeneratorDataset处理数据卡住问题，一般为竞争GIL导致的死锁问题，推荐使用 py-spy dump -pid \{PID\}来定位。

**2. 解决办法：**

在GeneratorDataset的第一个入参\`source\`的定义时，涉及到Python function中全部使用numpy.ndarray来替代Tensor

使用Tensor.asnumpy\(\)方法替换numpy.array\(Tensor\)

对于这个问题，可以在代码的218行，把np.array\(image\)和np.array\(\[record.label\]\) 换成 image.asnumpy\(\)和record.label.asnumpy\(\)

![](figures/3.png)

