Saat ini saya mencoba membaca data dari file .csv dengan Python 2.7 hingga 1 juta baris, dan 200 kolom (file berkisar dari 100mb hingga 1.6gb). Saya dapat melakukan ini (sangat lambat) untuk file dengan kurang dari 300.000 baris, tetapi begitu saya pergi ke atas, saya mendapatkan kesalahan memori. Kode saya terlihat seperti ini:
def getdata(filename, criteria):
data=[]
for criterion in criteria:
data.append(getstuff(filename, criteron))
return data
def getstuff(filename, criterion):
import csv
data=[]
with open(filename, "rb") as csvfile:
datareader=csv.reader(csvfile)
for row in datareader:
if row[3]=="column header":
data.append(row)
elif len(data)<2 and row[3]!=criterion:
pass
elif row[3]==criterion:
data.append(row)
else:
return data
Alasan klausa else dalam fungsi getstuff adalah bahwa semua elemen yang sesuai dengan kriteria akan dicantumkan bersama dalam file csv, jadi saya meninggalkan loop ketika saya melewatinya untuk menghemat waktu.
Pertanyaan saya adalah:
Bagaimana saya bisa mengatur agar ini bekerja dengan file yang lebih besar?
Apakah ada cara agar saya bisa membuatnya lebih cepat?
Komputer saya memiliki RAM 8GB, menjalankan Windows 7 64bit, dan prosesornya 3,40 GHz (tidak yakin informasi apa yang Anda butuhkan).
sumber
Jawaban:
Anda membaca semua baris ke dalam daftar, lalu memproses daftar itu. Jangan lakukan itu .
Proses baris Anda saat Anda membuatnya. Jika Anda perlu memfilter data terlebih dahulu, gunakan fungsi generator:
Saya juga menyederhanakan pengujian filter Anda; logikanya sama tetapi lebih ringkas.
Karena Anda hanya mencocokkan satu urutan baris yang cocok dengan kriteria, Anda juga bisa menggunakan:
Anda sekarang dapat mengulang
getstuff()
secara langsung. Lakukan hal yang sama digetdata()
:Sekarang putar langsung ke
getdata()
kode Anda:Anda sekarang hanya memiliki satu baris dalam memori, bukan ribuan baris per kriteria.
yield
menjadikan suatu fungsi sebagai fungsi generator , yang berarti fungsi tidak akan berfungsi sampai Anda mulai mengulanginya.sumber
csv.DictReader
? Karena pengujian saya pada file .csv 2.5GB menunjukkan bahwa mencoba mengulang baris demi baris seperti ini saat menggunakannya alih-alihcsv.reader
menyebabkan proses Python berkembang menjadi penggunaan memori 2.5GB penuh.Meskipun jawaban Martijin adalah prob yang terbaik. Berikut adalah cara yang lebih intuitif untuk memproses file csv besar untuk pemula. Ini memungkinkan Anda memproses kelompok baris, atau potongan, pada satu waktu.
sumber
Saya melakukan cukup banyak analisis getaran dan melihat kumpulan data besar (puluhan dan ratusan juta poin). Pengujian saya menunjukkan fungsi pandas.read_csv () menjadi 20 kali lebih cepat daripada numpy.genfromtxt (). Dan fungsi genfromtxt () 3 kali lebih cepat dari numpy.loadtxt (). Tampaknya Anda membutuhkan panda untuk kumpulan data yang besar.
Saya memposting kode dan kumpulan data yang saya gunakan dalam pengujian ini di blog yang membahas MATLAB vs Python untuk analisis getaran .
sumber
apa yang berhasil untuk saya dulu dan sekarang adalah supercepat
Solusi kerja lainnya adalah:
sumber
df_train=df_train.compute()
baris dalam solusi pertama Anda memuat seluruh kumpulan data ke dalam memori ... yang mana dia berusaha untuk tidak melakukannya?Untuk seseorang yang mendapatkan pertanyaan ini. Menggunakan panda dengan ' chunksize ' dan ' usecols ' membantu saya membaca file zip besar lebih cepat daripada opsi lain yang diusulkan.
sumber
inilah solusi lain untuk Python3:
di sini
datareader
adalah fungsi generator.sumber
Jika Anda menggunakan panda dan memiliki banyak RAM (cukup untuk membaca seluruh file ke dalam memori) coba gunakan
pd.read_csv
denganlow_memory=False
, misalnya:sumber