删除数据文件后,如何更新PyTorch数据集的长度?
删除数据集文件后PyTorch数据集长度未更新的解决方法
问题场景
创建MoleculeDataset实例后,通过os.remove删除了/content/data/processed目录下的107个文件,但调用len(datasetAB)仍返回初始的1448,手动修改__len__的尝试也无效。
核心原因
自定义的MoleculeDataset初始化时,已经把数据集的样本数量等元信息加载到内存中,直接删除磁盘上的文件不会自动触发数据集重新读取这些信息,所以长度始终显示旧值。
正确解决方式
1. 重新初始化数据集(最简单直接)
删除文件后,重新创建MoleculeDataset实例,让它重新读取磁盘上的文件并计算真实长度:
# 删除完不需要的文件后,重新初始化数据集 datasetAB = MoleculeDataset('clintox.csv', root='/content/data') print(len(datasetAB)) # 此时会返回正确的样本数
2. 给数据集类添加刷新方法
如果不想重新初始化,可以给MoleculeDataset类添加一个刷新数据的方法,让它重新加载磁盘上的文件并更新内部状态:
from torch.utils.data import Dataset import os class MoleculeDataset(Dataset): # 保留你原有的__init__、__getitem__等方法 def refresh(self): # 重新获取processed目录下的有效文件列表(根据你的文件格式调整) self.processed_files = [f for f in os.listdir(self.processed_dir) if f.endswith('.pt')] # 重新加载数据(调用你类中原有的数据加载逻辑) self.data = self._load_processed_data() def __len__(self): # 直接返回当前实际的文件数或数据长度,不要用固定值 return len(self.processed_files) # 或者return self.data.shape[0],根据你的数据存储方式调整 # 使用示例 datasetAB.refresh() print(len(datasetAB)) # 现在长度显示正确
3. 修正你之前的错误写法
你之前尝试的方法存在语法错误,正确的__len__方法需要用双下划线,并且要确保返回的是最新的数据长度:
# 正确重写__len__方法(要放在MoleculeDataset类内部) def __len__(self): # 确保self.data是最新刷新后的数据 return self.data.shape[0]
内容的提问来源于stack exchange,提问作者Formal_this
相关产品推荐
相关产品推荐

