Практические пределы кадра данных R
Я читал о том, как read.table неэффективен для больших файлов данных. Также, как R не подходит для больших наборов данных. Поэтому мне было интересно, где я могу найти практические ограничения и диаграммы производительности для (1) чтения в данных разных размеров (2), работающих с данными разных размеров.
По сути, я хочу знать, когда производительность ухудшается, и когда я попал в дорожный блок. Также было бы полезно использовать любое сравнение с С++/MATLAB или другими языками. наконец, если есть какое-то специальное сравнение производительности для Rcpp и RInside, это было бы здорово!
Ответы
Ответ 1
R подходит для больших наборов данных, но вам, возможно, придется немного поработать над тем, чему вас научат вводные учебники. Я сделал запись в Big Data for R, которая сжимает набор данных 30 ГБ и который может оказаться полезным для вдохновения.
Обычными источниками информации для начала являются Просмотр высокопроизводительных вычислений и список рассылки R-SIG HPC по адресу R-SIG HPC.
Основной предел, с которым вы должны работать, - это исторический предел длины вектора для элементов 2 ^ 31-1, что было бы не так уж плохо, если бы R не хранил матрицы в качестве векторов. (Предел для совместимости с некоторыми библиотеками BLAS.)
Мы регулярно анализируем записи данных телекоммуникационных вызовов и маркетинговые базы данных с многомиллионными клиентами, использующими R, поэтому будем рады поговорить больше, если вы заинтересованы.
Ответ 2
Физические пределы возникают из-за использования 32-битных индексов на векторах. В результате допускаются векторы до 2 ^ 31 - 1. Матрицы - это векторы с размерами, поэтому произведение nrow(mat)
и ncol(mat)
должно быть в пределах 2 ^ 31 - 1. Кадры данных и списки являются общими векторами, поэтому каждый компонент может принимать 2 ^ 31 - 1 записи, что для кадров данных означает, что у вас может быть много строк и столбцов. Для списков вы можете иметь 2 ^ 31 - 1 компоненты, каждый из 2 ^ 31 - 1 элементов. Это взято из недавнего сообщения от Duncan Murdoch в ответ на Q в R-Help
Теперь, когда все должно соответствовать ОЗУ со стандартом R, поэтому это может быть более предел, но Высокопроизводительные вычисления что другие упомянули, содержит сведения о пакетах, которые могут обойти проблемы в памяти.
Ответ 3
1) Руководство по импорту/экспорту R должно быть первым портом вызова для вопросов об импорте данных - есть много вариантов, и то, что будет работать для вас, может быть очень специфичным.
http://cran.r-project.org/doc/manuals/R-data.html
read.table
особенно сильно улучшена производительность, если используются предоставленные ему опции, в частности colClasses
, comment.char
и nrows
- это потому, что эта информация должна быть выведена из самих данных, что может быть дорогостоящим.
2) Существует определенный предел длины (общее количество элементов) для любого вектора, матрицы, массива, столбца в кадре данных или списке. Это связано с 32-разрядным индексом, используемым под капотом, и верно для 32-битного и 64-битного R. Число равно 2 ^ 31 - 1. Это максимальное количество строк для data.frame, но он настолько велик, что у вас гораздо больше шансов исчерпать память даже для отдельных векторов, прежде чем вы начнете собирать несколько из них.
Подробнее см. help(Memory-limits)
и help(Memory)
.
Один вектор этой длины будет занимать много гигабайт памяти (зависит от типа и режима хранения каждого вектора - 17,1 для числовых), поэтому он вряд ли будет подходящим пределом, если вы действительно не подталкиваете вещи. Если вам действительно нужно проталкивать вещи из доступной системной памяти (здесь требуется 64-разрядная версия), то стандартные методы баз данных, описанные в руководстве по импорту/экспорту или параметрам файла с отображением памяти (например, пакет ff
), стоят принимая во внимание. CRAN Task View High Performance Computing - хороший ресурс для этого конца.
Наконец, если у вас есть стопки оперативной памяти (16 ГБ или более) и требуется 64-битная индексация, она может появиться в будущей версии R. http://www.mail-archive.com/[email protected]/msg92035.html
Кроме того, Росс Ихака обсуждает некоторые исторические решения и будущие направления для R-языка в газетах и говорит здесь:
http://www.stat.auckland.ac.nz/~ihaka/?Papers_and_Talks
Ответ 4
Я могу ответить только на read.table
, так как у меня нет опыта работы с большими наборами данных. read.table
выполняется плохо, если вы не предоставляете аргументы colClasses
. Без него read.table
по умолчанию используется NA
и пытается угадать класс каждого столбца, и это может быть медленным, особенно когда у вас много столбцов.
Ответ 5
При чтении больших файлов csv x GB <=> y.1e6 rows
я думаю, что data.table::fread
(начиная с версии 1.8.7) - это самая быстрая альтернатива, которую вы можете получить, сделав install.packages("data.table", repos="http://R-Forge.R-project.org")
Обычно вы получаете коэффициент от 5 до 10 (и все sep
, row.names
и т.д. обрабатываются самой функцией). Если у вас много файлов и достаточно приличный компьютер (несколько ядер), я рекомендую использовать пакет parallel
(как часть R.2.14) для загрузки одного файла на ядро.
В прошлый раз я делал это между односторонней загрузкой с read.csv
и многопоточным на 4-х ядерном использовании fread
, я перешел от 5 минут до 20 секунд