0

s3://my-bucket/in.tsv.gzロードして処理したい大きなファイルがあり、その処理済みバージョンを s3 出力ファイルに書き戻しますs3://my-bucket/out.tsv.gz

  1. すべてのファイルをメモリにロードせずにs3から直接合理化するにはどうすればよいですかin.tsv.gz(メモリに収まりません)
  2. 処理された gzip ストリームを s3 に直接書き込むにはどうすればよいですか?

.tsv次のコードでは、入力 gzip されたデータフレームを s3 からロードする方法と、それがローカルに配置されている場合にどのように記述するかを示していbucket_dir_local = ./ます。

import pandas as pd
import s3fs
import os
import gzip
import csv
import io

bucket_dir = 's3://my-bucket/annotations/'
df = pd.read_csv(os.path.join(bucket_dir, 'in.tsv.gz'), sep='\t', compression="gzip")

bucket_dir_local='./'
# not sure how to do it with an s3 path
with gzip.open(os.path.join(bucket_dir_local, 'out.tsv.gz'), "w") as f:
    with io.TextIOWrapper(f, encoding='utf-8') as wrapper:
        w = csv.DictWriter(wrapper, fieldnames=['test', 'testing'], extrasaction="ignore")
        w.writeheader()
        for index, row in df.iterrows():
            my_dict = {"test": index, "testing": row[6]}
            w.writerow(my_dict)

編集smart_openは行くべき道のように見えます。

4

2 に答える 2

2

ファイルをダウンロードするには、S3 オブジェクトを python で直接ストリーミングできます。その投稿全体を読むことをお勧めしますが、そこからのいくつかの重要な行

import boto3

s3 = boto3.client('s3', aws_access_key_id='mykey', aws_secret_access_key='mysecret') # your authentication may vary
obj = s3.get_object(Bucket='my-bucket', Key='my/precious/object')

import gzip

body = obj['Body']

with gzip.open(body, 'rt') as gf:
    for ln in gf:
        process(ln)

残念ながら、S3 は真のストリーミング入力をサポートしていませんが、この SO の回答には、ファイルを分割して各チャンクを S3 に送信する実装があります。「真のストリーム」ではありませんが、全体をメモリに保持する必要なく、大きなファイルをアップロードできます

于 2020-11-30T04:51:52.597 に答える