Hesaplama hızı R?


16

Mevcut büyük stokastik modellerimizden birini SAS'tan ve yeni bir dile taşımakla görevlendirildim. Şahsen, geleneksel bir derlenmiş dili tercih ediyorum, ancak PI, daha önce hiç kullanmadığım R'yi kontrol etmemi istiyor. Modeli SAS'tan çıkarma motivasyonumuz (1) birçok kişinin buna erişimi yoktur, çünkü SAS pahalıdır, (2) yorumlanmış bir dilden uzaklaşmak istiyoruz ve (3) SAS yavaş sahip olduğumuz model türü.

(1) için, açıkça R, özgür olma ihtiyacını karşılar. (2) için, ideal olarak, bir yürütülebilir dosya oluşturmak istiyoruz, ancak R normal olarak komut dosyası dili olarak kullanılır. Birisinin yakın zamanda bir R derleyici çıkardığını görüyorum - bu iyi karşılandı mı? Kullanımı kolay mı? Kullanıcıyı R'yi indirmeye zorlamayız. (3) için SAS ile olan sorunumuz, I / O yazma ve veri setlerini okumada harcanan her zamandır. Modelimiz hesaplama açısından yoğun ve genellikle çalışma zamanı ile sınırlıyız. (örneğin, hafta sonu boyunca insanların bilgisayarlarını kaçak yapmak için alışılmadık bir şey değil.) Fortran'da yerleşik, aynı işi olmayan benzer bir modelimiz var, çünkü tüm işler hafızada yapıldı. R nasıl çalışır? Veri adımlarında çalıştığı için SAS ile aynı mı olacak, dosya okuma ve yazma? Veya bellekte dizi manipülasyonu yapabilir mi?


Genellikle tüm çalışmalarınızı tek bir veri adımında yaparak sas'ı hızlandırabilirsiniz. Verileri yalnızca bir kez etkili bir şekilde okuduğunuz için bu G / Ç sürelerini azaltmalıdır. Çok sayıda prosedür kullanmak da sizi yavaşlatacaktır. Örneğin, proc glm veya proc logistic'i (bootstrap için söyleyin) tekrar tekrar modelliyorsanız, büyük bir veri kümesi oluşturmak ve by ifadesi kullanmak birçok proc çağrısını çağırmaktan daha hızlıdır (bir makro% do döngüsü kullanmak gibi). İyi sas programlamak, sen en azından artık değil diğer yazılım daha sebebiyle okuma ve (dosyaları çıkış olanağı için çalışma zamanı sorunlarınız olmamalı
probabilityislogic

Ayrıca, sas veri adımlarında geçici dizileri, R'deki matrisleri nasıl kullandığınıza benzer şekilde kullanabilirsiniz.
probabilityislogic

Yanıtlar:


18

R bellekte çalışır - bu nedenle verilerinizin çoğu işlev için belleğe sığması gerekir.

Derleyici paket, düşündüğün şeyi düşünürsem (Luke Tierney'nin R ile sağlanan derleyici paketi), geleneksel anlamda derlenmiş bir dil (C, Fortran) ile aynı şey değildir. Java VM tarafından yürütülen Java bayt kodu veya Emacs LISP kodunun bayt derlemesi anlamında R için bir bayt derleyicisidir. R kodunu makine koduna derlemez, aksine R kodunu bayt koduna hazırlar, böylece yorumlanacak ham R kodundan daha verimli kullanılabilir.

Fortran'ı iyi oluşturduysanız, muhtemelen her iki dünyanın da en iyisine sahip olabileceğinizi unutmayın; R derlenmiş Fortran rutinlerini çağırabilir.


Teşekkürler! Harika R grafiklerine sahip olabileceğimi ve derlenmiş Fortran rutinlerini çağırabileceğimi bilmek güzel. Bu cevap olabilir!
Melissa

2
Gavin'in bellek hakkındaki notunu genişletmek için: daha büyük veri kümeleriyle çalışıyorsanız bu CRAN görev görünümündeki Büyük Bellek bölümüne bakın: cran.r-project.org/web/views/HighPerformanceComputing.html
Brandon Bertelsen

1
Ayrıca, Rcpp'in performansta artımlı kazançlar elde etmek için kullanılabileceğine dikkat etmek önemlidir.
Brandon Bertelsen

Rcpp, C ++ 'yı R ile / içinde kullanmak üzere sarmak için kullanışlıdır. Bu sürece (son derece) yardımcı olur, ancak derlenmiş kodu çağırmak için hala R'nin temel araçlarını kullanır. OP zaten Fortran kodlarına veya Fortran becerilerine sahipse, Rcpp daha az kullanılabilir.
Monica'yı eski durumuna getirin. G. Simpson

13

Ben kullandım SAS15 yıldır, ve kullanmaya başladılar Rbazı önde Bunun birkaç yıl için içinde etrafında müdahalesi ile ciddi geçtiğimiz 6 ay. Programlama perspektifinden bakıldığında, R veri manipülasyonları doğrudan mı, gerekli olmadığı için eşdeğer DATAveya PROC SQLprosedür yoktur (ikincisi SAS, harici veri kaynaklarından, örneğin idari verilerden yapılacak çok fazla veri manipülasyonu olduğunda daha verimli olur). Bu, şimdi asmak alıyorum, veri manipülasyonu daha hızlı Rve çok daha az kod gerektirdiği anlamına gelir .

Karşılaştığım ana sorun bellektir. Tüm R paketleri WEIGHTtür belirtimlerine izin vermez , bu nedenle SASdeğişkenlerde FREQveya REPLICATEdeyimlerde kullanılan veri kümeleriniz varsa sorun yaşayabilirsiniz. R ffve bigmemorypaketlerine baktım, ancak tüm R paketleriyle uyumlu görünmüyorlar, bu yüzden nispeten nadir olan ve toplanan analizler gerektiren çok büyük veri kümeleriniz varsa, bellekle ilgili sorunlarınız olabilir.

Otomasyon için, eğer varsa SAS macros, eşdeğerini programlayabilir Rve toplu olarak çalıştırabilirsiniz.

Kodlama için R, Notepad++dili kullanıyordum ve dilini ayarlıyordum Rve şimdi sevinçlerini keşfediyorum R Studio. Her iki ürün de ücretsizdir ve geliştirilmiş SASsözdizimi GUI'si gibi dil işaretleme yapar (Şimdiye kadar sözdizimi ekranını kullandım SAS).

İle arasında geçiş yapan kişiler için bir web sitesi ve ilgili kitap var . Bazı komutları nasıl çevireceğinizi bulmaya çalışırken onları faydalı buldum .SASRSASR

Güncelleme: gelirken fındık beni sürdü bir şey Rolduğunu Rher şeyin (bir veri kümesidir üstlenmez data frameiçinde Rtabiriyle) o şekilde bir istatistiksel paket bu değil, çünkü SAS, SPSS, Statavb vardır. Yani, örneğin, bu almak için biraz zaman aldı ifben için yardım alma tuttu çünkü çalışma ifadeleri ifben gerekli ise (belki ya matrisler) vektörler ile ifadeleri ifile çalıştı deyimi data frames. Bu nedenle yardım sayfalarının muhtemelen normalden daha fazla okunması gerekir, çünkü yapmak istediğiniz komutun sahip olduğunuz veri nesnesi türüyle çalışıp çalışmadığını kontrol etmeniz gerekir.

Yeni bir Rkomut öğrenirken beni hala çılgına çeviren kısım (örneğin, katkıda bulunan bir paketteki analiz yöntemi), komutların yardımının genellikle tamamen kendi kendine yetmediği. Komutu ve sık sık ...içerdiği kullanım notlarını öğrenmeye çalışmak için yardım sayfasına gideceğim . Bazen, neyin nerede olduğunu veya neyin gitmesi gerektiğini bulmaya çalışmak ...beni tekrarlayan bir döngüye sürüklüyor. SASSözdiziminin ayrıntılı örneklerini ve örnekte çalışmanın açıklamasını içeren çalışılmış örnekleri sağlayan yardım notlarının göreceli kısalığı oldukça büyük bir şoktu.


2
+1 Lütfen istatistik yazılım kaynaklarına bağlantılar topladığımız meta dizimizi güncellemeyi düşünün . Orada R için bir yanıt ve SAS için başka bir cevap var: her ikisi de r4stats.com'a bir bağlantıdan faydalanacak. (Bu konu aslında SSS bölümümüzün bir parçası. Güncel ve faydalı kalmasını umuyoruz.)
whuber

1
R ayrıca RODBC sürücüleri veya SQLite üzerinden SQL erişimini destekleyen paketlere sahiptir.
12'de DW

1
R yardımı hakkındaki yorumlarınızı kabul ediyorum. Aslında yıllar önce R posta listelerinden birinde ne söylediğine dikkat çektim. Yanıt olumlu değildi. Adil olmak gerekirse, ben (a) muhtemelen kendimi çok iyi ifade etmedim ve somut örnekler vermedim ve (b) konuyu takip etmedim. Özetlemek gerekirse, sorun 1 çok karmaşık örneklerdir ve çok fazla ilgisiz kavram içermektedir. Karmaşık örnekler iyidir, ancak basit örnekleri izlemelidir. Sorun 2, örneklerin ne yaptığına dair hemen hemen hiçbir açıklama veya açıklama olmamasıdır.
Faheem Mitha

R "yardım" ile ilgili olarak patronumun bana söylediği bir şeyi hatırlatıyor. "R'yi, bilgisayar başında yanınızda oturan R'yi zaten tanıyan biriyle yaparak öğrenirsiniz"
probabilityislogic 13

Ve herkes için kitaplar ve Stack Overflow var. Evet, R'yi kendiniz öğrenmek oldukça zor, en azından benim için oldu.
Michelle

10

R bir programlama dilidir. Veri adımlarında çalışmaz. Yapmasını istediğiniz her şeyi yapar, çünkü bir programlama dili, arzularınız için bir köle, kıvırcık parantez ve sütunlarla ifade edilir.

Fortran veya C gibi düşünün, ancak örtük vektörizasyonla, diziler ve dinamik bellek yönetimi üzerinde döngü yapmak zorunda kalmazsınız, böylece herhangi bir zamanda dizi boyutlarını malloc () veya bildirmek zorunda kalmazsınız.

Çoğunlukla bellekte tüm işlerini yapar, ancak bir dosyanın bir kısmını okumak istiyorsanız, onu karıştırın, sonra sonuçların bazılarını tükürün ve sonraki biti okuyun, iyi, devam edin ve bir R programı yazın bunu yapar.

Modelin hesaplama açısından yoğun olduğunu ancak G / Ç nedeniyle SAS'ın yavaş olduğunu söylerken kendinizle çelişiyorsunuz ... Biri veya diğeri kesinlikle ...

Fortran'da zaten benzer bir şeyiniz varsa ve yorumlanmış bir dilden uzaklaşmak istediğinizi söylüyorsanız, neden sadece Fortran'da da yapmıyorsunuz?

R derleyicisi bazı hızlandırmalara neden olabilir, ancak R kodunuz zaten iyi yazılmışsa, çok büyük bir şey elde edemezsiniz - C veya Fortran'da yazmak gibi değil.


Ah, kendimi iyi açıklamadım. SAS'ta G / Ç'de çok fazla zaman harcanması anlamına gelen veri kümelerinin manipülasyonunda yoğundur. İlk önerim Fortran'dı, ancak PI R'ye geçiş yapmakla ilgileniyor, bu yüzden kontrol etmemi istedi. Teşekkürler!
Melissa

7

Varsayılan olarak SAS'ın bellekten daha büyük modellerle çalışabileceğini anlıyorum, ancak özellikle biglm veya ff gibi paketleri kullanmıyorsanız, R'de durum böyle değil.

Ancak, R'de vektörleştirilebilen dizi çalışması yapıyorsanız, çok hızlı olacaktır - bazı durumlarda bir C programının hızının yarısı olabilir, ancak vektörleştirilemeyen bir şey yapıyorsanız, oldukça yavaş. Size bir örnek vermek gerekirse:

# create a data.frame with 4 columns of standard normally distributed RVs
N <- 10000

# test 1
system.time( {df1 <- data.frame(h1=rnorm(N),
                h2=rpois(N, lambda=5),
                h3=runif(N),
                h4=rexp(N))
} )
# about 0.003 seconds elapsed time

# vectorised sum of columns 1 to 4
# i.e. it can work on an entire column all at once
# test 2
system.time( { df1$rowtotal1 <- df1$h1 + df1$h2 + df1$h3 + df1$h4 })
# about 0.001 seconds elapsed time

# test 3
# another version of the vectorised sum
system.time( { df1$rowtotal2 <- rowSums(df1[,c(1:4)]) })
# about 0.001 seconds elapsed time

# test 4
# using a loop... THIS IS *VERY* SLOW AND GENERALLY A BAD IDEA!!! :-)
system.time( {
        for(i in 1:nrow(df1)) {
                df1$rowtotal3 <- df1[i,1]+ df1[i,2] + df1[i,3] + df1[i,4]
        }
} )
# about 9.2 seconds elapsed time

N'yi on ila 100.000 faktör kadar artırdığımda, 20 dakika sonra 4. testten vazgeçtim, ancak 1: 3 testleri her biri 61, 3 ve 37 mili saniye sürdü

N = 10.000.000 için 1: 3 testlerinin süresi 3.3s, 0.6s ve 1.6s'dir

Bunun bir i7 dizüstü bilgisayarda ve N = 10 milyon için 480mb'de yapıldığını unutmayın, bellek bir sorun değildi.

32-bit pencerelerdeki kullanıcılar için, ne kadar belleğiniz olursa olsun R için 1,5 gb'lık bir bellek sınırı vardır, ancak 64-bit pencereler veya 64-bit linux için böyle bir sınır yoktur. Bu günlerde bellek zamanımın bir saatlik maliyeti ile karşılaştırıldığında çok ucuz, bu yüzden bu sorunu çözmek için zaman harcamak yerine sadece daha fazla bellek satın alıyorum. Ancak bu, modelinizin belleğe sığacağını varsayar.


1
(+1) Yararlı çizimler sunduğunuz için teşekkür ederiz Sean!
whuber

3

(2), ideal olarak, yürütülebilir bir dosya oluşturmak istiyoruz, ancak R normal olarak komut dosyası dili olarak kullanılıyor

Evet ve bu R'ye taşınmanın iyi bir nedeni. Bir R paketi yazmanın amacı, kullanıcıların işlevlerinizin R tarafından sağlanan diğer araçlarla kolayca etkileşime girmesini sağlamaktır, örneğin, önyüklemeli verileri beslemek ... veya istedikleri her şeyi. Bunun önemli olduğunu düşünmüyorsanız, C / C ++ veya en sevdiğiniz derlenmiş dilinizi kullanın.

Ö()rle()

Bu yüzden çok dikkatli ol. İlk denemelerinizden sonra, kesinlikle R'yi tiksinirsiniz, çünkü onu yavaş, garip bir sözdizimi vb. İle bulacaksınız. Bildiğinizde, çok verimli bir araç olabilir. C / C ++ kodlaması için bir ön aşama olarak R'deki yöntemlerinizi yazarak da sonlandırabilirsiniz. Nihai aşama, önceden derlenmiş işlevler oluşturmak için R'nin API'sini öğrenmek olacak ve bir R sihirbazı olacaksınız :)


2

Görünüşe göre bellekteki dizi manipülasyonu SAS için büyük bir şey. R ile ilgili özellikleri bilmiyorum, ancak R, ff ve bigmemory için bellek genişletme paketleri, verileri bellekten diske taşıdığından, R'nin varsayılan olarak bellekte çalıştığını tahmin ediyorum. Hızı veya bellek kullanımını iyileştirmek istiyorsanız size işaretçilerim var. Hızı artırmak için, önce R'yi amaçlandığı gibi kullanmanız gerekir, yani: kodunuzu vektörleştirin ve bayt kodu derlemesini kullanın. (Ayrıca: bellek kopyalama işlemlerinden mümkün olduğunca kaçının.) İkincisi, kodunuzdaki yavaş yamaları tanımlamak için sağlanan kod profiler Rprof () kullanın ve gerekirse bunları C veya C ++ ile yeniden yazın. Daha fazla belleğe ihtiyacınız varsa, verilerinizde bir kerede bir yığın okumak için read.table () işlevindeki atlama bağımsız değişkenini kullanabilir ve ayrıca R'ye veritabanı işleme yardımcı programları ekleyen RMySQL gibi bir paket de kullanabilirsiniz. Hâlâ daha fazla belleğe ihtiyacınız varsa ve aynı anda hız düşüşünü karşılayabiliyorsanız, R paketini paralel olarak çalıştırmak için kar paketini kullanabilirsiniz. (Bu konuyla ilgili ayrıntıları ve daha fazlasını geçen yılın sonunda yayınlanan Norman Matloff'un "R Programlama Sanatı" kitabında bulabilirsiniz. Burada belirtilen paketlerle ilgili ayrıntıları çevrimiçi bulabilirsiniz.)

Sitemizi kullandığınızda şunları okuyup anladığınızı kabul etmiş olursunuz: Çerez Politikası ve Gizlilik Politikası.
Licensed under cc by-sa 3.0 with attribution required.