DataLoader 多线程读取数据
使用DataLoader读取数据时,为了加快效率,所以使用了多个线程,即num_workers不为0,在windows下报了错误。
DataLoader(trainset, batch_size=128, shuffle=True, num_workers=2)
https://github.com/pytorch/pytorch/pull/5585 这里是官方说明了一些原因,应该是windows下的一些线程文件读写的问题
在Windows上,FileMapping对象应必须在所有相关进程都关闭后,才能释放。
启用多线程处理时,子进程将创建FileMapping,然后主进程将打开它。 之后当子进程将尝试释放它的时候,因为父进程还在引用,所以它的引用计数不为零,无法释放。 但是当前代码没有提供在可能的情况下再次关闭它的机会。这个版本官方说num_workers=1是可以用的,更多的线程还在解决,不过现在即便是用2个子进程也已经可以了。
解决方法有二(各自均亲测有效)
- num_workers=0,也就是单线程操作
- 在使用DataLoader读取之前加上 if name == '__main__' : 就可以了。
报错信息如下: