Saya bertanya-tanya ... Jika saya membaca, katakanlah, file csv 400MB ke dalam bingkai data panda (menggunakan read_csv atau read_table), adakah cara untuk menebak berapa banyak memori yang dibutuhkan ini? Hanya mencoba untuk merasakan bingkai data dan memori yang lebih baik ...
126
top
dan kemudianShift + M
memilah penggunaan memori saya.x=df.loc[[]]
membutuhkan beberapa0.1
detik untuk dihitung (untuk mengekstrak baris nol) dan, lebih jauh lagi, membutuhkan ratusan megabyte memori, sama seperti dataframe asli, mungkin karena beberapa penyalinan di bawahnya.Jawaban:
df.memory_usage()
akan mengembalikan seberapa banyak setiap kolom menempati:Untuk memasukkan indeks, teruskan
index=True
.Jadi untuk mendapatkan konsumsi memori secara keseluruhan:
Juga, lewat
deep=True
akan memungkinkan laporan penggunaan memori yang lebih akurat, yang menjelaskan penggunaan penuh objek yang ada.Ini karena penggunaan memori tidak menyertakan memori yang dikonsumsi oleh elemen yang bukan merupakan komponen dari array if
deep=False
(kasus default).sumber
deep=True
deep=True
memory_usage()
mengembalikan penggunaan memori dalam byte (seperti yang Anda harapkan).Berikut perbandingan metode yang berbeda -
sys.getsizeof(df)
paling sederhana.Untuk contoh ini,
df
adalah dataframe dengan 814 baris, 11 kolom (2 ints, 9 objek) - baca dari shapefile 427kbsys.getsizeof (df)
df.memory_usage ()
df.info ()
Mencetak info bingkai data ke stdout. Secara teknis ini adalah kibibyte (KiB), bukan kilobyte - seperti yang dikatakan oleh docstring, "Penggunaan memori ditampilkan dalam unit yang dapat dibaca manusia (representasi basis-2)." Jadi untuk mendapatkan byte akan dikalikan dengan 1024, misal 451,6 KiB = 462.438 byte.
sumber
g
dirujuk kode di atas?df.info(memory_usage="deep")
, itu mengembalikan "392.6 MB", sedangkansys.getsizeof(df)
dandf.memory_usage(index=True, deep=True).sum()
keduanya mengembalikan sekitar "411718016" (~ 411MB). Bisakah Anda menjelaskan mengapa 3 hasil tidak konsisten? terima kasihdf.memory_usage(deep=True).sum()
mengembalikan hampir sama dengandf.memory_usage(index=True, deep=True).sum()
. dalam kasus saya,index
tidak memakan banyak memori. Yang cukup menarik, saya menemukan bahwa411718016/1024/1024 = 392.6
,df.info(memory_usage="deep")
mungkin digunakan2^10
untuk mengkonversi byte ke MB , yang membuat saya bingung. Terima kasih atas bantuan Anda: D.df.info
mengembalikan mebibyte (2 ^ 10), bukan megabyte (10 ^ 6) - akan mengubah jawabannya.Saya pikir saya akan membawa lebih banyak data ke diskusi.
Saya menjalankan serangkaian tes tentang masalah ini.
Dengan menggunakan
resource
paket python saya mendapatkan penggunaan memori dari proses saya.Dan dengan menulis csv ke dalam
StringIO
buffer, saya dapat dengan mudah mengukur ukurannya dalam byte.Saya menjalankan dua eksperimen, masing-masing membuat 20 kerangka data dengan ukuran yang meningkat antara 10.000 baris dan 1.000.000 baris. Keduanya memiliki 10 kolom.
Dalam percobaan pertama saya hanya menggunakan float di dataset saya.
Ini adalah bagaimana memori meningkat dibandingkan dengan file csv sebagai fungsi dari jumlah baris. (Ukuran dalam Megabyte)
Percobaan kedua saya memiliki pendekatan yang sama, tetapi data dalam dataset hanya terdiri dari string pendek.
Tampaknya hubungan ukuran csv dan ukuran dataframe bisa sangat bervariasi, namun ukuran di memori akan selalu lebih besar dengan faktor 2-3 (untuk ukuran frame dalam percobaan ini)
Saya ingin melengkapi jawaban ini dengan lebih banyak eksperimen, beri komentar jika Anda ingin saya mencoba sesuatu yang istimewa.
sumber
Anda harus melakukan ini secara terbalik.
Secara teknis memori adalah tentang ini (yang termasuk indeks)
Jadi 168MB dalam memori dengan file 400MB, 1 juta baris dari 20 kolom float
JAUH lebih ringkas jika ditulis sebagai file HDF5 biner
Datanya acak, jadi kompresi tidak banyak membantu
sumber
read_csv
?iotop
sukatop
/htop
untuk menonton (dalam waktu nyata) kinerja IO.nbytes
akan meremehkan bruto jika Anda memiliki string misalnya dalam dataframe.Jika Anda mengetahui
dtype
s dari array Anda, maka Anda dapat langsung menghitung jumlah byte yang diperlukan untuk menyimpan data Anda + beberapa untuk objek Python itu sendiri. Atributnumpy
array yang berguna adalahnbytes
. Anda bisa mendapatkan jumlah byte dari array di pandaDataFrame
dengan melakukanobject
dtype array menyimpan 8 byte per objek (array dtype objek menyimpan pointer ke buramPyObject
), jadi jika Anda memiliki string di csv Anda, Anda perlu memperhitungkan yangread_csv
akan mengubahnya menjadiobject
array dtype dan menyesuaikan perhitungan Anda.EDIT:
Lihat
numpy
halaman jenis skalar untuk lebih jelasnya diobject
dtype
. Karena hanya referensi yang disimpan, Anda juga perlu mempertimbangkan ukuran objek dalam array. Seperti yang dikatakan halaman itu, array objek agak mirip denganlist
objek Python .sumber
Ya ada. Panda akan menyimpan data Anda dalam
ndarray
struktur numpy 2 dimensi yang mengelompokkannya berdasarkan dtypes.ndarray
pada dasarnya adalah larik data C mentah dengan header kecil. Jadi Anda bisa memperkirakan ukurannya hanya dengan mengalikan ukurandtype
isinya dengan dimensi array.Misalnya: jika Anda memiliki 1000 baris dengan 2
np.int32
dan 5np.float64
kolom, DataFrame Anda akan memiliki satunp.int32
array 2x1000 dan satunp.float64
array 5x1000 yaitu:4bytes * 2 * 1000 + 8bytes * 5 * 1000 = 48000 bytes
sumber
DataFrame
?pandas
memiliki implementasi yang sangat efisienread_table
di Cython (ini jauh lebih baik daripada numpy loadtxt) jadi saya berasumsi bahwa itu mem-parser dan menyimpan data langsung ke filendarray
.Ini saya percaya ini memberikan ukuran dalam memori objek apa pun di python. Bagian dalam perlu diperiksa terkait dengan panda dan numpy
sumber