Подтвердить что ты не робот

Практические пределы кадра данных R

Я читал о том, как read.table неэффективен для больших файлов данных. Также, как R не подходит для больших наборов данных. Поэтому мне было интересно, где я могу найти практические ограничения и диаграммы производительности для (1) чтения в данных разных размеров (2), работающих с данными разных размеров.

По сути, я хочу знать, когда производительность ухудшается, и когда я попал в дорожный блок. Также было бы полезно использовать любое сравнение с С++/MATLAB или другими языками. наконец, если есть какое-то специальное сравнение производительности для Rcpp и RInside, это было бы здорово!

4b9b3361

Ответ 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 секунд