【Python】大容量のファイルをアップロードする方法【requests】

プログラミングのKnow-howを共有しましょう

【Python】大容量のファイルをアップロードする方法【requests】

スポンサーリンク

Pythonのrequestsモジュールを使用して大容量のファイルをアップロードする方法をご紹介します。ポイントはメモリです。

RestAPIにファイルをアップロードする時、対象のファイルが大容量だった場合は以下の点を考慮する必要があります。

  • ファイル読み込みによるメモリの圧迫

やってはいけない方法

以下の方法は絶対にやってはいけないアップロードの方法です。

上記の2行目でメモリにファイルの内容が全て読み込まれてしまいます。終わりの始まりです。

近年メモリ容量は増加しているから安心!というわけではなく、
それに比例してファイルそのもののサイズも増えています(動画は画質向上から顕著ですね)。

何も気にせずRestAPIへのアップロード処理を実装してしまい、いざアップロードするファイルが100GBなんて容量だった時

全てを読み込む前にメモリが枯渇

PCフリーズ

終わりの始まり

なんてことになります。そうならないための方法を2つご紹介するので、是非ご活用ください。

1.一番簡単な方法

1つ目の方法は非常に簡単です。以下のように指定するだけでファイルをメモリに読み込まずアップロードができます。

ファイルのオブジェクトをrequests.postのdataに指定しているだけです。超簡単ですね。
requestsモジュールの内部でファイルを少しずつ読み込んで送信してくれます。

ただ1点、気をつけなければならないのはファイルの読み込みモードに
“rb(バイナリモード)”を指定することです。
理由としては以下のとおりです。

  • 上記の方法を使用するとrequestsモジュールが自動で”Content-Length(ファイルの長さ)”ヘッダーを付加する
  • “Content-Length”はファイル内のバイト数となるので、bを付けずテキストモードで開くと不整合でエラーが発生する可能性がある

2.自分で分割する方法

2つ目の方法はあまり使い所がないかもしれませんが、紹介します。
以下のように自分でファイルを分割してアップロードする方法です。

1の方法と同様に、バイト数を指定してファイルを分割するので”rb(バイナリモード)”を指定する必要があります。
この方法の利点は以下の通りです。

  • 分割サイズを自分で決めることができる

メモリに最新の注意を払う状況の時はおすすめの方法です。