PostgreSQL
 sql >> Teknologi Basis Data >  >> RDS >> PostgreSQL

MemoryError saat Menggunakan Metode read() dalam Membaca File JSON Ukuran Besar dari Amazon S3

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.




  1. Database
  2.   
  3. Mysql
  4.   
  5. Oracle
  6.   
  7. Sqlserver
  8.   
  9. PostgreSQL
  10.   
  11. Access
  12.   
  13. SQLite
  14.   
  15. MariaDB
  1. Sisipkan waktu dengan waktu musim panas zona waktu

  2. Heroku - ActiveRecord::StatementInvalid (PG::Error:ERROR:kolom yang diminta tidak ada

  3. haruskah saya mengaktifkan kumpulan pernyataan c3p0?

  4. Menghitung tanggal di Postgres dengan menambahkan bulan?

  5. Penyimpanan zona waktu dalam stempel waktu tipe data dengan zona waktu