当尝试从 s3 读取文件时joblib.load()
我收到错误ValueError: embedded null byte
当尝试读取文件时。
这些文件是由 joblib 创建的,并且可以从本地副本(在上传到 s3 之前在本地制作)成功加载,因此错误可能出在 S3 的存储和检索协议中。
最小代码:
####Imports (AWS credentials assumed)
import boto3
from sklearn.externals import joblib
s3 = boto3.resource('s3')
bucket_str = "my-aws-bucket"
bucket_key = "some-pseudo/folder-set/my-filename.joblib"
joblib.loads(s3.Bucket(bucket_str).Object(bucket_key).get()['Body'].read())
以下代码在输入之前在内存中重建文件的本地副本joblib.load()
,从而实现成功加载。
from io import BytesIO
import boto3
from sklearn.externals import joblib
s3 = boto3.resource('s3')
bucket_str = "my-aws-bucket"
bucket_key = "some-pseudo/folder-set/my-filename.joblib"
with BytesIO() as data:
s3.Bucket(bucket_str).download_fileobj(bucket_key, data)
data.seek(0) # move back to the beginning after writing
df = joblib.load(data)
我假设,但不确定,boto3 分块下载文件的方式中的某些内容会创建一个破坏 joblib 的空字节,并且 BytesIO 在让joblib.load()
查看数据流。
附言。在这种方法中,文件永远不会接触本地磁盘,这在某些情况下很有用(例如,具有大 RAM 但磁盘空间很小的节点......)
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)