Saya memiliki file csv yang sangat besar yang saya buka di panda sebagai berikut ....
import pandas
df = pandas.read_csv('large_txt_file.txt')
Setelah saya melakukan ini, penggunaan memori saya meningkat sebesar 2GB, yang diharapkan karena file ini berisi jutaan baris. Masalah saya muncul ketika saya perlu melepaskan memori ini. Aku lari ....
del df
Namun, penggunaan memori saya tidak turun. Apakah ini pendekatan yang salah untuk melepaskan memori yang digunakan oleh bingkai data panda? Jika ya, bagaimana cara yang tepat?
gc
modul dan memanggilgc.collect()
tetapi mungkin tidak memulihkan memoridel df
tidak dipanggil langsung setelah pembuatan df kan? Saya pikir ada referensi ke df pada titik Anda menghapus df tersebut. Jadi itu tidak akan dihapus, melainkan menghapus namanya.df = ''
di akhir kode Anda? Sepertinya untuk membersihkan RAM yang digunakan oleh dataframe.Jawaban:
Mengurangi penggunaan memori dengan Python itu sulit, karena Python tidak benar-benar melepaskan memori ke sistem operasi . Jika Anda menghapus objek, maka memori tersedia untuk objek Python baru, tetapi tidak
free()
kembali ke sistem ( lihat pertanyaan ini ).Jika Anda tetap berpegang pada larik numpy numerik, itu dibebaskan, tetapi objek kotak tidak.
Mengurangi Jumlah Kerangka Data
Python menjaga memori kita pada watermark tinggi, tapi kita bisa mengurangi jumlah total dataframe yang kita buat. Saat memodifikasi kerangka data Anda, lebih baik
inplace=True
, jadi Anda tidak membuat salinan.Gotcha umum lainnya memegang salinan dari dataframe yang dibuat sebelumnya di ipython:
Anda dapat memperbaikinya dengan mengetik
%reset Out
untuk menghapus riwayat Anda. Atau, Anda dapat menyesuaikan berapa banyak histori yang disimpan ipythonipython --cache-size=5
(defaultnya adalah 1000).Mengurangi Ukuran Dataframe
Jika memungkinkan, hindari menggunakan dtypes objek.
Nilai dengan objek dtype diberi kotak, yang berarti array numpy hanya berisi pointer dan Anda memiliki objek Python penuh di heap untuk setiap nilai dalam dataframe Anda. Ini termasuk string.
Sementara numpy mendukung string berukuran tetap dalam array, panda tidak ( ini menyebabkan kebingungan pengguna ). Ini dapat membuat perbedaan yang signifikan:
Anda mungkin ingin menghindari penggunaan kolom string, atau mencari cara untuk merepresentasikan data string sebagai angka.
Jika Anda memiliki kerangka data yang berisi banyak nilai berulang (NaN sangat umum), Anda dapat menggunakan struktur data renggang untuk mengurangi penggunaan memori:
Melihat Penggunaan Memori
Anda dapat melihat penggunaan memori ( dokumen ):
Pada pandas 0.17.1, Anda juga dapat melakukannya
df.info(memory_usage='deep')
untuk melihat penggunaan memori termasuk objek.sumber
Seperti dicatat di komentar, ada beberapa hal yang bisa dicoba:
gc.collect
(@EdChum) mungkin menghapus beberapa hal, misalnya. Setidaknya dari pengalaman saya, hal-hal ini terkadang berhasil dan seringkali tidak.Ada satu hal yang selalu berhasil, karena ini dilakukan di OS, bukan bahasa, level.
Misalkan Anda memiliki fungsi yang membuat DataFrame besar menengah, dan mengembalikan hasil yang lebih kecil (yang mungkin juga berupa DataFrame):
Kemudian jika Anda melakukan sesuatu seperti
Kemudian fungsi tersebut dijalankan pada proses yang berbeda . Saat proses tersebut selesai, OS mengambil kembali semua resource yang digunakannya. Benar-benar tidak ada yang bisa dilakukan Python, panda, pengumpul sampah, untuk menghentikannya.
sumber
with multiprocessing.Pool(1) as pool: result = pool.map(huge_intermediate_calc, [something])
yang mengambil adalah menutup kumpulan setelah selesai.Ini memecahkan masalah melepaskan memori untuk saya !!!
bingkai data akan secara eksplisit disetel ke nol
sumber
del df
tidak akan dihapus jika ada referensi kedf
saat penghapusan. Jadi, Anda perlu menghapus semua referensi ke dalamnya dengandel df
untuk melepaskan memori.Jadi semua contoh yang terikat ke df harus dihapus untuk memicu pengumpulan sampah.
Gunakan objgragh untuk memeriksa mana yang menahan objek.
sumber
Sepertinya ada masalah dengan glibc yang memengaruhi alokasi memori di Pandas: https://github.com/pandas-dev/pandas/issues/2659
Itu Patch monyet rinci tentang masalah ini telah diselesaikan masalah bagi saya:
sumber