簡體   English   中英

如何將 .npy 文件直接寫入 s3?

[英]how to write .npy file to s3 directly?

我想知道是否有任何方法可以將數組作為 numpy 文件(.npy)直接寫入 AWS S3 存儲桶。 我可以使用np.save在本地保存文件,如下所示。 但我正在尋找一種直接將其寫入 S3 的解決方案,而無需先在本地保存。

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

如果您想繞過本地磁盤並將數據直接上傳到雲端,您可能需要使用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)

文檔:

您還可以使用s3fs ,它是 s3 的文件系統接口,是boto的包裝器。 此解決方案也使用pickle,因此請確保在allow_pickle=Truenp.load allow_pickle=True 請參閱下面的函數以進行寫入和讀取。

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')

我最近遇到了 s3fs 依賴與 boto3 沖突的問題,所以我盡量避免使用它。

這是我的保存解決方案:

from io import BytesIO
import numpy as np
from urllib.parse import urlparse
import boto3
client = boto3.client("s3")

def to_s3_npy(data: np.array, s3_uri: str):
    # s3_uri looks like f"s3://{BUCKET_NAME}/{KEY}"
    bytes_ = BytesIO()
    np.save(bytes_, data, allow_pickle=True)
    bytes_.seek(0)
    parsed_s3 = urlparse(s3_uri)
    client.upload_fileobj(
        Fileobj=bytes_, Bucket=parsed_s3.netloc, Key=parsed_s3.path[1:]
    )
    return True

並加載:

def from_s3_npy(s3_uri: str):
    bytes_ = BytesIO()
    parsed_s3 = urlparse(s3_uri)
    client.download_fileobj(
        Fileobj=bytes_, Bucket=parsed_s3.netloc, Key=parsed_s3.path[1:]
    )
    bytes_.seek(0)
    return np.load(bytes_, allow_pickle=True)

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM