2

大きなファイルのチャンク処理を可能にするために、 Amazon S3 Python ライブラリを仮装しようとしています。現在、「self.body = http_response.read()」を実行しているため、3G ファイルがある場合は、それを制御する前にすべてをメモリに読み込むことになります。

私の現在のアプローチは、ライブラリのインターフェイスを同じに保ちながら、データの各チャンクを読み取った後にコールバックを提供することです。次のようなもの:

data = []
while True:
    chunk = http_response.read(CHUNKSIZE)
    if not chunk:
        break
    if callback:
        callback(chunk)
    data.append(chunk)

今、私は次のようなことをする必要があります:

self.body = ''.join(data)

joinはこれを行う正しい方法ですか、それともすべてのチャンクをまとめる別の (より良い) 方法はありますか?

4

4 に答える 4

3

「join() は、データのチャンクを結合するための最良の方法です。これは、文字列の不変性と、連結ごとにさらに作成する必要があるため、O(n**2) です。この繰り返しの連結は、+= を使用して O(n) になる場合、最近のバージョンの CPython によって最適化されますが、その最適化はとにかく ''.join() と大まかに同等であり、明示的に O(n) オーバーですバイト数。

于 2009-02-28T01:24:44.827 に答える
1

python3 では、bytesオブジェクトは とは異なりますがstr、これに何か問題がある理由はわかりません。

于 2009-02-28T01:21:23.040 に答える
0

join本当に文字列全体をまとめる必要がある場合は問題ないように思えますが、とにかく全体を RAM に保存することになります。このような状況では、文字列の各部分を処理し、処理された部分を破棄する方法があるかどうかを確認しようとします。そのため、一度にメモリに保持する必要があるのは固定バイト数だけです。通常、これがコールバック アプローチのポイントです。(一度にチャンクの一部しか処理できない場合は、バッファーをキューとして使用して、未処理のデータを格納します。)

于 2009-02-28T01:24:43.890 に答える