SageMaker实例下载S3文件遇Device or resource busy错误求助
解决SageMaker实例从S3下载数据时的OSError: Errno 16问题
问题根源
你的代码存在逻辑错误:在循环遍历每个JSON文件时,每次都调用sagemaker_session.download_data并传入整个FOLDER_PREFIX,这会导致重复触发整个文件夹的下载操作。多个并行/重复的下载任务会争抢transcript_data/目录的资源,引发临时文件(如transcript_data/..Aea2DBEA)无法完成重命名的冲突,最终抛出"Device or resource busy"错误。
修复方案
根据你的需求,选择以下两种修正方式之一:
方式1:一次性下载整个文件夹(推荐)
如果目标是获取FOLDER_PREFIX下所有JSON文件,无需循环,直接调用一次download_data即可:
LOCAL_PATH = "transcript_data/" # 直接下载整个前缀下的内容,无需遍历文件 sagemaker_session.download_data(path=LOCAL_PATH, bucket=bucket, key_prefix=FOLDER_PREFIX)
方式2:逐个下载单个JSON文件
如果需要精确控制只下载JSON文件,循环时传入单个文件的key而非整个前缀:
LOCAL_PATH = "transcript_data/" files = sagemaker_session.list_s3_files(bucket, FOLDER_PREFIX) for file in files: if file.endswith('.json'): # 传入单个文件的key,而非前缀 sagemaker_session.download_data(path=LOCAL_PATH, bucket=bucket, key_prefix=file)
额外排查步骤
如果修复代码后仍报错:
- 检查
transcript_data/目录是否被其他进程占用:在终端执行lsof +D transcript_data/查看是否有进程在读写该目录,关闭占用进程后重试。 - 清理残留的临时文件:手动删除
transcript_data/目录下以..开头的临时文件,再重新执行下载。
内容的提问来源于stack exchange,提问作者Luka Savic
相关产品推荐
相关产品推荐

