2013-08-26 13 views
7
data.table içinde

Ben fread kullanıyorum (1.8.8 R 3.0.1) çok büyük dosyalar okumak için.fread koruma yığın taşması hatası

soruları dosya sayısal verileri satır 313 satır ve ~ 6600000 cols sahiptir ve dosya 12GB etrafında başındadır. Bu 512GB RAM ile bir Centos 6.4.

, dosyada okuma girişiminde

:

I max --max-ppsize 500000, ama aynı hata R başlangıç ​​çalıştı
g=fread('final.results',header=T,sep=' ') 
'header' changed by user from 'auto' to TRUE 
Error: protect(): protection stack overflow 

.

Ben de zaten sınırsız olarak ayarlandı

ulimit -s unlimited 

Sanal bellek aracılığıyla sınırsız yığın boyutunu ayarlama çalıştı.

Ben bu boyutta bir dosya ile gerçekçi davranıyorum? Oldukça açık bir şeyi özledim mi?

+0

Lütfen R-Forge'da v1.8.9'u deneyin (data.table ana sayfasında bağlantı). Orada yaymak için 10 hata düzeltmesi var, bkz. NEWS. Büyük dosya desteği bunlardan biri, ancak Windows üzerinde zaten Linux üzerinde olması gerektiği gibi. 6.6 milyon sütun (!) Yeni ve yeni bir hata olabilir. Lütfen v1.8.9 ile onaylayın ve biz oradan gideceğiz ... –

+0

@MatthewDowle Evet 6 milyon satırdan da memnun değilim. 1.8.9, aynı hata yükleyin. Çok daha küçük bir dosya yaptım, 10 satır x 50K cols, aynı hata. Çalışır 10 satır x 49,999 cols. – mpmorley

+1

Bu yorumdaki sütunları mı kastediyorsunuz (6 milyon satır yazdınız)? Çok ilginç ve garip, tam olarak 50.000 sütunda başarısız. Bu kadar çabuk homurdandığın için teşekkürler. Böyle bir sütun sınırını hatırlamıyorum. Bir göz atacak. –

cevap

6

Şimdi R-Forge üzerinde v1.8.9 sabit.

  • istenilmeyen bir 50,000 sütun sınırı fread kaldırılmıştır. Raporlama için mpmorley'e teşekkürler. Test eklendi. döngü içinde PROTECT R-exts section 5.9.1 göre

    // ********************************************************************* 
    // Allocate columns for known nrow 
    // ********************************************************************* 
    ans=PROTECT(allocVector(VECSXP,ncol)); 
    protecti++; 
    setAttrib(ans,R_NamesSymbol,names); 
    for (i=0; i<ncol; i++) { 
        thistype = TypeSxp[ type[i] ]; 
        thiscol = PROTECT(allocVector(thistype,nrow)); // ** HERE ** 
        protecti++; 
        if (type[i]==SXP_INT64) 
         setAttrib(thiscol, R_ClassSymbol, ScalarString(mkChar("integer64"))); 
        SET_TRUELENGTH(thiscol, nrow); 
        SET_VECTOR_ELT(ans,i,thiscol); 
    } 
    

    , gerekli değildir: Bazı

sebebi fread.c kaynakta bu bölümü yanlış var idi durumlarda, korumanın gerçekten gerekli olup olmadığının daha iyi takip edilmesi gerekmektedir. Özellikle çok sayıda nesnenin üretildiği durumların farkında olarak olmalıdır. İşaretçi koruma yığını sabit bir boyuta (varsayılan 10.000) sahiptir ve dolu olabilir. Daha sonra iyi bir fikir değil, sonra her şeyi görünür kılmak ve sonunda binlerce nesne UNPROTECT. hemen hemen değişmez bir ( otomatik olarak koruyan) başka bir nesnenin bir parçası olarak nesne atamak veya kullanımdan hemen sonra bunları korumasını da mümkün olacaktır. KORUYUN Yani

şimdi kaldırıldı ve her şey iyi mesafesindedir. (Bu metin yazıldığı için işaretçi koruma yığını sınırının 50.000'e düştüğü görülüyor; Defn.h #define R_PPSSIZE 50000L içeriyor.) Benzer bir şey için data.table C kaynağındaki diğer tüm PROTECT'leri kontrol ettim ve atamada bir tane bulundu ve sabitlendim .c de (referans olarak 50.000'den fazla sütun eklerken), başkaları yok.

Raporlama için teşekkürler!

+0

Bir 313 satır ve 6536299 cols dosyasıyla test edildi. 'system.time (geno <-fread ('final.results', sep ='', başlık = TRUE)) ' ' kullanıcı sistem elapsed' '881,321 16,594 923.957' – mpmorley

+0

@mpmorley büyük, test için teşekkürler. Bir 12GB dosya okumak için 15 dakika, belki de, çok geniş olduğu gibi geliyor. Senin için uygun mu? Başka herhangi bir şey daha hızlı okuyor mu? "Verbose = TRUE" tarafından bildirilen zamanlama dökümünü görmek ilginizi çeker. Örneğin, çoğunlukla mmap'ing harcanıyorsa, ayarlanacak başka seçenekler de olabilir. –

+0

Benim için kabul edilebilir, tüm bu verilerle yararlı bir şeyler yapmaya odaklanmıyorum, yeni bir gönderi görebiliyorum. Ancak, siz ve başkaları ilgilenirseniz, yayınlamaya ve yayınlamaya sevindim. – mpmorley