Penghematan yang signifikan dapat diperoleh dengan menghindari menyeruput seluruh file input Anda ke dalam memori sebagai list
garis.
Secara khusus, baris-baris ini sangat buruk dalam penggunaan memori, karena melibatkan penggunaan memori puncak dari bytes
objek ukuran seluruh file Anda, ditambah list
baris dengan isi file yang lengkap juga:
file_content = obj['Body'].read().decode('utf-8').splitlines(True)
for line in file_content:
Untuk file teks ASCII 1 GB dengan 5 juta baris, pada 64 bit Python 3.3+, itu adalah kebutuhan memori puncak sekitar 2,3 GB untuk hanya bytes
objek, list
, dan str
individual individu s dalam list
. Program yang membutuhkan RAM 2,3x lebih besar dari ukuran file yang diprosesnya tidak akan diskalakan ke file besar.
Untuk memperbaikinya, ubah kode asli tersebut menjadi:
file_content = io.TextIOWrapper(obj['Body'], encoding='utf-8')
for line in file_content:
Mengingat obj['Body']
tampaknya dapat digunakan untuk streaming lambat
ini harus menghapus keduanya salinan data file lengkap dari memori. Menggunakan TextIOWrapper
berarti obj['Body']
malas dibaca dan diterjemahkan dalam potongan (beberapa KB sekaligus), dan garis-garisnya juga diulang dengan malas; ini mengurangi permintaan memori ke jumlah kecil, sebagian besar tetap (biaya memori puncak akan tergantung pada panjang baris terpanjang), terlepas dari ukuran file.
Pembaruan:
Sepertinya StreamingBody
tidak mengimplementasikan io.BufferedIOBase
ABC. Itu memang memiliki API terdokumentasinya sendiri
meskipun, yang dapat digunakan untuk tujuan yang sama. Jika Anda tidak dapat membuat TextIOWrapper
melakukan pekerjaan untuk Anda (jauh lebih efisien dan sederhana jika dapat dibuat bekerja), alternatifnya adalah melakukan:
file_content = (line.decode('utf-8') for line in obj['Body'].iter_lines())
for line in file_content:
Tidak seperti menggunakan TextIOWrapper
, itu tidak mendapat manfaat dari decoding blok secara massal (setiap baris didekode secara individual), tetapi jika tidak, itu akan tetap mencapai manfaat yang sama dalam hal pengurangan penggunaan memori.