2017-10-31 182 views
5

ile mücadele ediyor Büyük bir csv'yi (18GB) belleğe yüklüyorum ve R ve Python arasındaki çok büyük farkları farkettim. Bu bir AWS ec2 r4.8xlarge which has 244 Gb of memory üzerindedir. Açıkçası bu aşırı bir örnektir, fakat prensip, gerçek makinelerde de küçük dosyalar için geçerlidir.Python ve R'ye çok büyük CSV veri kümesi yükleme Pandalar,

Dosyam, pd.read_csv kullanırken yaklaşık 17 dakika bellek yüklendi ve yüklendi. Aslında o kadar çok ki ben onunla hiçbir şey yapamam. Buna karşılık, data.table paketinden R'nin fread()'u ~ 7 dakika ve sadece ~ 55Gb bellek aldı.

Pandalar nesnesi neden data.table nesnesinden çok daha fazla bellek alıyor? Ayrıca, temel olarak diskteki metin dosyasından neredeyse 10 kat daha büyük pandalar nesnesi neden? .csv, verileri ilk sırada depolamak için özellikle etkili bir yoldur.

+0

Benzer şekilde [https://stackoverflow.com/questions/17444679/reading-a-huge-csv-file](https://stackoverflow.com/questions/17444679/reading-a-huge-csv-file) – RobertMc

+1

@RobertMc pandalar açısından değil – roganjosh

+0

Yeni, dev ve henüz CRAN'da değil, 1.10.5 'fread' kullanıyor musunuz? Ayrıca [paratext] (https://github.com/wiseio/paratext) adresini de deneyin. –

cevap

9

fread hızını geçemezsiniz, ancak bellek kullanımı gider olarak tahmin edersiniz, python'da 64 bit tam sayı olarak okunan tamsayılarınız var.

Dosyanızı varsayarsak şuna benzer:

a,b 
123456789,12345 

Ar, sen alırsınız:

sapply(fread('test.txt'), class) 
#   a   b 
#"integer64" "integer" 

Oysa python (64-bit makinede):

pandas.read_csv('test.txt').dtypes 
#a int64 
#b int64 

Böylece python'da daha fazla bellek kullanacaksınız. mesela beri,

pandas.read_csv('test.txt', dtype={'b': numpy.int32}).dtypes 
#a int64 
#b int32 

Küçük tamsayılar da .csv dosyasından daha fazla yer kaplıyor hem R ve piton nesneleri nedeni olacak: Bir çözüm olarak read_csv yılında türünü zorlayabilir Bir .csv dosyasındaki "1", 2 bayt (char + virgül veya satır sonu) alır, ancak bellekte 4 veya 8 bayt alır.

+0

Sanırım bu muhtemelen bir nokta. Read_csv'deki 'dtype 'seçeneğini kullanmayı hiç düşünmedim. Ayrıca, benim sütunlarım çok ikili, ama bahse girerim o 1'ler ve 0'ları da büyük tamsayılar olarak ele alıyor. İkili (veya çok küçük) tamsayılar için verimli bir numpy türü var mı yoksa sadece int32'yi mi kullanmalıyım? Muhtemelen hızı etkilemez, ama kesinlikle çok daha küçük yapmalıdır. Teşekkürler. – seth127

+0

'int8' kullanmayı deneyebilirsiniz. – eddi

+0

Bunu deneyeceğim. “Bu tek sütun int64, diğerlerinin hepsi int8” demek için bir yol varsa herhangi bir fikriniz var mı? Dokümantasyon, bunu bir dict olarak yapmak zorunda olduğunuzu söylüyor, ancak birkaç bin sütunum var (bu nedenle büyük dosya boyutu) bu yüzden biraz sıkıcı görünüyor. – seth127

-1

dask paketini kullanmayı deneyebilirsiniz. Temel olarak, dask DataFrame uygulamasının pandalarını sağlar, ancak paralel ve dağıtılmış ve gecikmeli hesaplamayı kullanabilir.