Saya mencoba membaca file csv besar (aprox. 6 GB) dalam panda dan saya mendapatkan kesalahan memori:
MemoryError Traceback (most recent call last)
<ipython-input-58-67a72687871b> in <module>()
----> 1 data=pd.read_csv('aphro.csv',sep=';')
...
MemoryError:
Ada bantuan untuk ini?
Jawaban:
Kesalahan menunjukkan bahwa mesin tidak memiliki cukup memori untuk membaca seluruh CSV menjadi DataFrame sekaligus. Dengan asumsi Anda tidak memerlukan seluruh dataset dalam memori sekaligus, satu cara untuk menghindari masalah adalah dengan memproses CSV dalam potongan (dengan menentukan
chunksize
parameter):The
chunksize
parameter menentukan jumlah baris per sepotong. (Potongan terakhir mungkin berisi kurang darichunksize
baris, tentu saja.)sumber
DF.append(chunk)
ke dalam lingkaran. Itu akan menggunakanO(N^2)
operasi penyalinan. Lebih baik menambahkan data yang dikumpulkan ke daftar , dan kemudian membangun DataFrame dari daftar dengan satu panggilan kepd.DataFrame
ataupd.concat
(tergantung pada jenis data yang dikumpulkan).DF.append(chunk)
dalam satu lingkaran membutuhkanO(N^2)
operasi penyalinanN
dengan ukuran potongan, karena setiap panggilan untukDF.append
mengembalikan DataFrame baru. Memanggilpd.DataFrame
ataupd.concat
sekali di luar loop mengurangi jumlah penyalinanO(N)
.chunksize
parameter mengacu pada jumlah baris per chunk. Potongan terakhir mungkin mengandung kurang darichunksize
baris, tentu saja.pd.concat([list_of_dfs])
sekali setelah loop jauh lebih cepat daripada meneleponpd.concat
ataudf.append
berkali-kali dalam loop. Tentu saja, Anda akan membutuhkan sejumlah besar memori untuk menahan seluruh csv 6GB sebagai satu DataFrame.Chunking seharusnya tidak selalu menjadi port of call pertama untuk masalah ini.
Apakah file tersebut besar karena pengulangan data non-numerik atau kolom yang tidak diinginkan?
Jika demikian, Anda kadang-kadang dapat melihat penghematan memori besar-besaran dengan membaca kolom sebagai kategori dan memilih kolom yang diperlukan melalui parameter pd.read_csv
usecols
.Apakah alur kerja Anda memerlukan pengirisan, manipulasi, ekspor?
Jika demikian, Anda dapat menggunakan dask.dataframe untuk mengiris, melakukan perhitungan dan mengekspornya secara berulang. Pemotongan dilakukan secara diam-diam oleh dask, yang juga mendukung subset API panda.
Jika semuanya gagal, baca baris demi baris melalui potongan.
Potongan melalui panda atau melalui perpustakaan csv sebagai pilihan terakhir.
sumber
Saya melanjutkan seperti ini:
sumber
read_csv
keread_table
?Untuk data besar saya sarankan Anda menggunakan pustaka "dask"
misalnya:
Anda dapat membaca lebih lanjut dari dokumentasi di sini .
Alternatif hebat lainnya adalah menggunakan modin karena semua fungsionalitasnya identik dengan panda, tetapi memanfaatkan pada pustaka dataframe terdistribusi seperti dask.
sumber
Jawaban di atas sudah memuaskan topik. Bagaimanapun, jika Anda membutuhkan semua data dalam memori - lihat bcolz . Ini mengompresi data dalam memori. Saya memiliki pengalaman yang sangat bagus dengannya. Tetapi banyak fitur panda yang hilang
Sunting: Saya mendapatkan tingkat kompresi sekitar 1/10 atau ukuran orig saya pikir, tentu saja tergantung pada jenis data. Fitur penting yang hilang adalah agregat.
sumber
chunks
metode yang disebutkan, kemudian menggunakan bcolz jika Anda membutuhkan semua data dalam memori untuk melakukan analisis. Hanya pemikiran saja.Anda dapat membaca data sebagai potongan dan menyimpan setiap potongan sebagai acar.
Pada langkah selanjutnya Anda membaca di acar dan menambahkan setiap acar ke bingkai data yang Anda inginkan.
sumber
df
sepenuhnya sesuai dengan memori (seperti yang tersirat) dan berisi jumlah data yang sama dengan input Anda, tentunya Anda tidak perlu memotong sama sekali?Fungsi read_csv dan read_table hampir sama. Tetapi Anda harus menetapkan pembatas “,” ketika Anda menggunakan fungsi read_table di program Anda.
sumber
Solusi 1:
Menggunakan panda dengan data besar
Solusi 2:
sumber
dfList.append
, hanya memproses setiap chunk (df
) secara terpisahBerikut ini contohnya:
sumber
Anda dapat mencoba sframe, yang memiliki sintaksis yang sama dengan panda tetapi memungkinkan Anda untuk memanipulasi file yang lebih besar dari RAM Anda.
sumber
Jika Anda menggunakan panda membaca file besar ke dalam chunk dan kemudian menghasilkan baris demi baris, inilah yang telah saya lakukan
sumber
Saya ingin membuat jawaban yang lebih komprehensif berdasarkan sebagian besar solusi potensial yang sudah disediakan. Saya juga ingin menunjukkan satu lagi bantuan potensial yang dapat membantu proses membaca.
Opsi 1: dtypes
"Dtypes" adalah parameter yang cukup kuat yang dapat Anda gunakan untuk mengurangi tekanan memori
read
metode. Lihat ini dan ini jawaban . Panda, secara default, mencoba menyimpulkan dtipe data.Mengacu pada struktur data, setiap data yang disimpan, alokasi memori dilakukan. Pada tingkat dasar lihat nilai-nilai di bawah ini (Tabel di bawah ini menggambarkan nilai-nilai untuk bahasa pemrograman C):
Lihat ini halaman untuk melihat kecocokan antara tipe NumPy dan C.
Katakanlah Anda memiliki array bilangan bulat digit . Anda dapat menetapkan secara teoritis dan praktis, katakanlah array dengan tipe integer 16-bit, tetapi Anda kemudian akan mengalokasikan lebih banyak memori daripada yang sebenarnya Anda perlukan untuk menyimpan array itu. Untuk mencegah hal ini, Anda dapat mengatur
dtype
opsi padaread_csv
. Anda tidak ingin menyimpan item array sebagai integer panjang di mana sebenarnya Anda bisa memasangnya dengan integer 8-bit (np.int8
ataunp.uint8
).Amati dtype peta berikut.
Sumber: https://pbpython.com/pandas_dtypes.html
Anda dapat melewatkan
dtype
parameter sebagai parameter pada metode panda seperti dict padaread
like {kolom: type}.Opsi 2: Baca oleh Potongan-potongan
Membaca data dalam potongan memungkinkan Anda untuk mengakses bagian dari data dalam memori, dan Anda dapat menerapkan preprocessing pada data Anda dan menyimpan data yang diproses daripada data mentah. Akan jauh lebih baik jika Anda menggabungkan opsi ini dengan yang pertama, dtypes .
Saya ingin menunjukkan bagian buku masak panda untuk proses itu, di mana Anda dapat menemukannya di sini . Perhatikan dua bagian di sana;
Opsi 3: Dask
Dask adalah kerangka kerja yang didefinisikan dalam situs web Dask sebagai:
Ia dilahirkan untuk menutupi bagian-bagian penting yang tidak dapat dijangkau oleh panda. Dask adalah kerangka kerja yang kuat yang memungkinkan Anda lebih banyak mengakses data dengan memprosesnya secara terdistribusi.
Anda dapat menggunakan dask untuk memproses data Anda secara keseluruhan, Dask menangani bagian chunking, jadi tidak seperti panda, Anda bisa menentukan langkah-langkah pemrosesan Anda dan membiarkan Dask melakukan pekerjaannya. Dask tidak menerapkan perhitungan sebelum secara eksplisit didorong oleh
compute
dan / ataupersist
(lihat jawabannya di sini untuk perbedaannya).Bantuan Lainnya (Gagasan)
sumber
Selain jawaban di atas, bagi mereka yang ingin memproses CSV dan kemudian mengekspor ke csv, parket atau SQL, d6tstack adalah pilihan bagus lainnya. Anda dapat memuat banyak file dan berkaitan dengan perubahan skema data (kolom tambah / dihapus). Chunked out of core support sudah ada di dalamnya.
sumber
Jika seseorang masih mencari sesuatu seperti ini, saya menemukan bahwa perpustakaan baru ini yang disebut modin dapat membantu. Ini menggunakan komputasi terdistribusi yang dapat membantu membaca. Inilah artikel yang bagus membandingkan fungsinya dengan panda. Ini pada dasarnya menggunakan fungsi yang sama dengan panda.
sumber
modin
dibandingkan dengan yang sudah mapandask.dataframe
? Sebagai contoh, lihat berpindah dari panda ke dask untuk memanfaatkan semua core cpu lokal .Sebelum menggunakan opsi chunksize jika Anda ingin memastikan tentang fungsi proses yang ingin Anda tulis di dalam chunking for-loop seperti yang disebutkan oleh @unutbu, Anda cukup menggunakan opsi nrows.
Setelah Anda yakin bahwa blok proses sudah siap, Anda bisa meletakkannya di chunking for loop untuk seluruh kerangka data.
sumber