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.
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ą.
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_TalksWarning: 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.
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
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