質問をすることでしか得られない、回答やアドバイスがある。

15分調べてもわからないことは、質問しよう!

新規登録して質問してみよう
ただいま回答率
85.46%
Python

Pythonは、コードの読みやすさが特徴的なプログラミング言語の1つです。 強い型付け、動的型付けに対応しており、後方互換性がないバージョン2系とバージョン3系が使用されています。 商用製品の開発にも無料で使用でき、OSだけでなく仮想環境にも対応。Unicodeによる文字列操作をサポートしているため、日本語処理も標準で可能です。

Q&A

解決済

1回答

3627閲覧

pythonにおけるストリーム処理

yonchome

総合スコア41

Python

Pythonは、コードの読みやすさが特徴的なプログラミング言語の1つです。 強い型付け、動的型付けに対応しており、後方互換性がないバージョン2系とバージョン3系が使用されています。 商用製品の開発にも無料で使用でき、OSだけでなく仮想環境にも対応。Unicodeによる文字列操作をサポートしているため、日本語処理も標準で可能です。

0グッド

0クリップ

投稿2021/09/17 23:22

編集2021/09/17 23:30

python

1def get_s3file(bucket_name, key): 2 s3 = boto3.resource('s3') 3 s3obj = s3.Object(bucket_name, key).get() 4 5 return io.TextIOWrapper(io.BytesIO(s3obj['Body'].read()))

S3からCSVをオンメモリで読み込む処理です。
なるべくメモリを削減できるようストリームで処理していきたいです。
そのためBytesIOを作成し、TextIOWrapperで文字列ストリームに変換しています。
ここで疑問なのですがBytesIOのインスタンスを生成する際にs3obj['Body'].read()としている時点でオブジェクトはメモリ上に全て展開されてしまっているのでしょうか?
もしそうなら既にメモリ上に展開されているのでその後BytesIO,TextIOWrapperに渡してストリームを生成する必要がないかと思ってきました。

引用元:https://qiita.com/shinsaka/items/9b9fbd4d3ba1b5e59bce

気になる質問をクリップする

クリップした質問は、後からいつでもMYページで確認できます。

またクリップした質問に回答があった際、通知やメールを受け取ることができます。

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

guest

回答1

0

ベストアンサー

  • 既にメモリ上に展開されているのでその後BytesIO,TextIOWrapperに渡してストリームを生成する必要がないかと思ってきました。

そのとおりです。

Pythonでは、関数などを呼び出す前にすべての引数を評価してから評価結果を関数に渡します。
評価とは式を実行してその結果を得ることです。
したがって、BytesIOのインスタンスを生成する前にs3obj['Body'].read()を実行していて、そのタイミングでメモリ上に展開されます。

引数の評価については、公式ドキュメント 6.3.4. 呼び出し (call)に書かれている、以下の部分をお読みください。

引数式は全て、呼び出しを試みる前に評価されます。

投稿2021/09/18 00:13

編集2021/09/18 00:19
ppaul

総合スコア24666

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

yonchome

2021/09/18 07:15

ありがとうございます。 今回の場合、BytesIO,TextIOWrapperに渡してストリームを生成するメリットや思い当たる理由などは何かあったりしますでしょうか、、?
yonchome

2021/09/19 03:12

思いつきました。 バイトを文字列で扱うためにデコードする。そのままバイトをデコードするとデコード結果全体をメモリに展開することになりますが、文字列ストリームを生成すれば全体をメモリに展開することなく処理できますね。
ppaul

2021/09/19 11:02

メモリ削減という意味では、ガベージコレクションの動きがデータ次第なので、計ってみないとわからないです。 たいていの場合、ガベージコレクションとOSが色々とやってくれているのでメモリ不足で困ることは少ないです。
guest

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

15分調べてもわからないことは
teratailで質問しよう!

ただいまの回答率
85.46%

質問をまとめることで
思考を整理して素早く解決

テンプレート機能で
簡単に質問をまとめる

質問する

関連した質問