Ошибка в joblib.load при чтении файла из s3 - PullRequest
0 голосов
/ 24 января 2020

При попытке прочитать файл из 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())

1 Ответ

0 голосов
/ 24 января 2020

Следующий код восстанавливает локальную копию файла в памяти перед подачей в 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() видит поток данных.

PS. В этом методе файл никогда не касается локального диска, что полезно при некоторых обстоятельствах (например, узел с большой оперативной памятью, но небольшим дисковым пространством ...)

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...