如何直接将.npy文件写入s3?

时间:2018-01-01 12:14:16

标签: python numpy amazon-s3

我想知道是否有任何方法可以直接将数组作为numpy文件(.npy)写入AWS S3存储桶。我可以使用np.save在本地保存文件,如下所示。但我正在寻找一种解决方案,可以直接将其写入S3,而无需先在本地保存。

a = np.array([1, 2, 3, 4])
np.save('/my/localfolder/test1.npy', a)

2 个答案:

答案 0 :(得分:2)

您还可以使用s3fs,它是s3(环绕boto的包装器)的文件系统接口。此解决方案还使用泡菜,因此请确保在allow_pickle=Truenp.load。请参考下面的功能进行读写。

import numpy as np
import pickle
from s3fs.core import S3FileSystem
s3 = S3FileSystem()

def saveLabelsToS3(npyArray, name):
    with s3.open('{}/{}'.format(bucket, name), 'wb') as f:
        f.write(pickle.dumps(npyArray))

def readLabelsFromS3(name):
    return np.load(s3.open('{}/{}'.format(bucket, name)), allow_pickle=True)

# Use as below
saveLabelsToS3(labels, 'folder/filename.pkl')
labels = readLabelsFromS3('folder/filename.pkl')

答案 1 :(得分:0)

如果您要绕过本地磁盘并将数据直接上传到云,则可能要使用pickle而不是.npy文件:

import boto3
import io
import pickle

s3_client = boto3.client('s3')

my_array = numpy.random.randn(10)

# upload without using disk
my_array_data = io.BytesIO()
pickle.dump(my_array, my_array_data)
my_array_data.seek(0)
s3_client.upload_fileobj(my_array_data, 'your-bucket', 'your-file.pkl')

# download without using disk
my_array_data2 = io.BytesIO()
s3_client.download_fileobj('your-bucket', 'your-file.pkl', my_array_data2)
my_array_data2.seek(0)
my_array2 = pickle.load(my_array_data2)

# check that everything is correct
numpy.allclose(my_array, my_array2)

文档: