You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

删除数据文件后,如何更新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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.07.23 22:23:23