2013-08-26 20 views
7

Używam fread w data.table (1.8.8, R 3.0.1) w celu odczytu bardzo dużych plików.Błąd przepełnienia stosu ochrony przed przepełnieniem

Plik, którego dotyczy pytanie, ma 313 wiersze i ~ 6,6 milionów kolsjek wierszy danych liczbowych, a plik ma około 12 GB. To jest Centos 6.4 z 512 GB pamięci RAM.

Gdy próbuję odczytać w pliku:

g=fread('final.results',header=T,sep=' ') 
'header' changed by user from 'auto' to TRUE 
Error: protect(): protection stack overflow 

starałem począwszy R z --max-ppsize 500000, który jest max, ale z tego samego błędu.

Próbowałem również ustawienie rozmiaru stosu nieograniczony poprzez

ulimit -s unlimited 

Wirtualnej pamięci został już ustawiony na nieograniczony.

Czy jestem nierealny z plikiem tej wielkości? Czy tęskniłem za czymś dość oczywistym?

+0

Proszę wypróbować v1.8.9 na R-Forge (link na stronie domowej data.table). Istnieje 10 poprawek do 'fread', patrz NEWS. Obsługa dużych plików jest jednym z nich, ale na Windowsie, tak jak powinno być dobrze na Linuksie. 6,6 milionów kolumn (!) Jest nowością i może być nowym błędem. Potwierdź w wersji 1.8.9, a my przejdziemy dalej ... –

+0

@MatthewDowle Tak, nie jestem zadowolony z 6 milionów wierszy. Zainstaluj 1.8.9, ten sam błąd. Zrobiłem znacznie mniejszy plik, 10 wierszy x 50 KB, ten sam błąd. 10 wierszy x 49,999 kol. Działa. – mpmorley

+1

Czy chodziło Ci o kolumny w tym komentarzu (napisałeś 6 milionów wierszy)? Bardzo interesujące i dziwne jest to, że zawodzi dokładnie 50 000 kolumn. Dobra robota, żeby tak szybko to poprawić. Nie przypominam sobie żadnego takiego limitu kolumn. Przyjrzy się. –

Odpowiedz

6

Teraz naprawione w wersji 1.8.9 na R-Kuźnia.

  • niezamierzony granica 50000 kolumnie zostały usunięte w fread. Dzięki mpmorley do raportowania. Test został dodany.

Powodem była ta część mam źle w źródle fread.c:

// ********************************************************************* 
// 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); 
} 

Według R-exts section 5.9.1, które chronią wewnątrz pętli nie jest potrzebna:

W niektórych przypadkach należy lepiej śledzić, czy rzeczywiście potrzebna jest ochrona. Be szczególnie świadomy sytuacji, w których generowana jest duża liczba obiektów. Stos ochrony wskaźnika ma ustalony rozmiar (domyślnie 10 000) i może być pełny. To nie jest dobry pomysł, aby następnie chronić wszystko w zasięgu wzroku i UNPROTECT kilka tysięcy obiektów na końcu. To jest prawie zawsze możliwe, aby przypisać obiekty jako część innego obiektu (który automatycznie chroni je) lub odłączyć je natychmiast po użyciu.

Tak, więc PROTECT jest teraz usunięty i wszystko jest w porządku. (Wydaje się, że limit stosu wskaźnika myszy został zredukowany do 50 000 od momentu napisania tego tekstu, Defn.h zawiera #define R_PPSSIZE 50000L.) Sprawdziłem wszystkie inne PROTECTy w źródle danych w pliku data.table dla czegoś podobnego i znalezionego i naprawionego w przypisaniu .c też (przy dodawaniu ponad 50 000 kolumn przez odniesienie), żadnych innych.

Dzięki za zgłoszenie!

+0

Testowany z plikiem 313 wierszy i 6536299 cols. 'system.time (Geno <-fread ('final.results', sep =””, header = true))' ' systemu użytkownik elapsed' ' 881,321 16,594 923.957' – mpmorley

+0

@mpmorley Świetnie, dzięki za testowanie. 15 minut na odczytanie pliku 12 GB brzmi dobrze, może, biorąc pod uwagę, że jest tak szeroki. Czy to ci odpowiada? Czy cokolwiek innego czyta go szybciej? Byłby zainteresowany, aby zobaczyć podział czasowy zgłoszony przez 'verbose = TRUE'. Jeśli na przykład jest to głównie wydane mmap'ing, mogą pojawić się dalsze opcje do dostrojenia. –

+0

Dla mnie jest to do przyjęcia, nie skupiam się na zrobieniu czegoś pożytecznego z tymi wszystkimi danymi, może zobaczyć nowy post. Jednak cieszę się, że mogę biegać i pisać, jeśli ty i inni jesteście zainteresowani. – mpmorley

Powiązane problemy