Praktyczne ograniczenia ramki danych R

Czytałem o tym, jak czytać.tabela nie jest wydajna dla dużych plików danych. Również jak R nie nadaje się do dużych zbiorów danych. Tak więc zastanawiałem się, gdzie mogę znaleźć, Jakie są praktyczne limity i wszelkie wykresy wydajności dla (1) czytania w danych o różnych rozmiarach (2) pracy z danymi o różnych rozmiarach.

W efekcie chcę wiedzieć, kiedy pogorszy się wydajność i kiedy uderzę w blokadę. Również każde porównanie z C++ / MATLAB lub innych języków byłoby bardzo pomocne. wreszcie, jeśli jest jakieś specjalne porównanie wydajności dla Rcpp i RInside, byłoby świetnie!

5 answers

R jest odpowiedni dla dużych zbiorów danych, ale być może będziesz musiał zmienić swój sposób pracy nieco od tego, czego uczą cię podręczniki wprowadzające. Zrobiłem post na Big Data dla R , który łamie zestaw danych 30 GB i który może okazać się przydatny do inspiracji.

Zwykłymi źródłami informacji na początek są High-Performance Computing Task View oraz lista dyskusyjna R-SIG HPC na R-SIG HPC.

Głównym limitem, który musisz obejść, jest historyczne ograniczenie długości wektora do 2^31-1 elementów, co nie byłoby takie złe, gdyby r Nie przechowywał macierzy jako wektorów. (Limit dotyczy kompatybilności z niektórymi bibliotekami BLAS.)

Regularnie analizujemy zapisy danych połączeń telco i marketingowe bazy danych z wieloma milionami klientów korzystających z R, więc chętnie porozmawiamy więcej, jeśli jesteś zainteresowany.

 46
Author: Allan Engelhardt,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2016-03-30 04:06:34

Granice fizyczne wynikają z użycia indeksów 32-bitowych na wektorach. W rezultacie dozwolone są wektory do 2^31-1. Macierze są wektorami o wymiarach, więc iloczyn nrow(mat) i {[1] } musi znajdować się w granicach 2^31 - 1. Ramki danych i listy są ogólnymi wektorami, więc każdy składnik może przyjmować 2^31 - 1 wpisów, co dla ramek danych oznacza, że możesz mieć tyle wierszy i kolumn. Dla list można mieć 2 ^ 31-1 elementów, każdy z 2^31 - 1 elementów. Wynika to z niedawnego posting by Duncan Murdoch in reply to a Q on R-Help

Teraz wszystko musi zmieścić się w pamięci RAM ze standardowym R, więc może to być bardziej palący limit, ale Widok zadań High-Performance Computing, o którym wspominali inni, zawiera szczegóły pakietów, które mogą obejść problemy z pamięcią.

 27
Author: Gavin Simpson,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2011-03-08 15:11:07

1) Instrukcja importu / eksportu R powinna być pierwszym portem, do którego należy dzwonić w przypadku pytań dotyczących importowania danych - istnieje wiele opcji i to, co będzie działać dla ciebie, może być bardzo szczegółowe.

Http://cran.r-project.org/doc/manuals/R-data.html

read.table w szczególności znacznie poprawiła wydajność, jeśli wykorzystywane są dostępne mu opcje, zwłaszcza colClasses, comment.char, i nrows - dzieje się tak dlatego, że informacje te należy wywnioskować z samych danych, co może być kosztowne.

2) istnieje określona granica długości (Całkowita liczba elementów) dla dowolnego wektora, macierzy, tablicy, kolumny w danych.ramka, czyli lista. Jest to spowodowane 32-bitowym indeksem używanym pod maską i jest prawdą dla 32-bitowych i 64-bitowych R. Liczba wynosi 2^31 - 1. Jest to maksymalna liczba wierszy dla danych.ramki, ale jest ona tak duża, że znacznie bardziej prawdopodobne jest, że zabraknie pamięci nawet dla pojedynczych wektorów, zanim zaczniesz zbierać kilka z nich.

Zobacz help(Memory-limits) i help(Memory) Po szczegóły.

Pojedynczy wektor o tej długości zajmie wiele gigabajtów pamięci (zależy od typu i trybu przechowywania każdego wektora-17.1 dla liczb), więc jest mało prawdopodobne, aby był to właściwy limit, chyba że naprawdę przesuwasz rzeczy. Jeśli naprawdę chcesz wypchnąć rzeczy poza dostępną pamięć systemową (64-bitowy jest tutaj obowiązkowy), warto rozważyć standardowe techniki bazodanowe omówione w podręczniku importu/eksportu lub opcje plików mapowanych w pamięci (jak pakiet ff). Widok zadania CRAN Wysokowydajne obliczenia są dobrym źródłem do tego celu.

Wreszcie, jeśli masz stosy pamięci RAM (16GB lub więcej) i potrzebujesz indeksowania 64-bitowego, może pojawić się w przyszłym wydaniu R. http://www.mail-archive.com/[email protected]/msg92035.html

Ponadto, Ross Ihaka omawia niektóre historyczne decyzje i przyszłe kierunki dla języka podobnego do R w artykułach i rozmowach tutaj: http://www.stat.auckland.ac.nz/ ~ ihaka/? Papers_and_Talks
 13
Author: mdsumner,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2011-03-08 15:21:31

Mogę odpowiedzieć tylko na temat read.table, ponieważ nie mam żadnego doświadczenia z dużymi zbiorami danych. read.table działa źle, jeśli nie podasz argumentów colClasses. Bez niego, read.table domyślnie NA i próbuje odgadnąć klasę każdej kolumny, a to może być powolne, zwłaszcza gdy masz dużo kolumn.

 8
Author: aL3xa,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2011-03-08 15:01:20

Podczas czytania dużych plików csv x GB <=> y.1e6 rows myślę, że data.table::fread (od wersji 1.8.7) jest najszybszą alternatywą, jaką możesz zrobić install.packages("data.table", repos="http://R-Forge.R-project.org")

Zwykle zyskujesz czynnik 5 do 10 (i wszystkie sep, row.names itp są rozpatrywane przez samą funkcję). Jeśli masz wiele plików i wystarczająco przyzwoity komputer (kilka rdzeni), polecam użycie pakietu parallel (jako część R. 2.14), aby załadować jeden plik na rdzeń.

Ostatnim razem zrobiłem to między monothreaded loading z read.csv i multithreaded na 4 rdzeniach użycie fread przeszedłem od 5 minut do 20 sekund

 7
Author: statquant,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2013-02-26 21:01:45