Обработка и анализ больших данных в R

Я знаю, что это не новая концепция в R, и я просмотрел представление задач высокой производительности и параллельных вычислений. С учетом сказанного, я задаю этот вопрос с точки зрения невежества, поскольку у меня нет формального образования в области компьютерных наук, и я полностью самоучка.

Недавно я собрал данные из Twitter Streaming API, и в настоящее время необработанный JSON находится в текстовом файле размером 10 ГБ. Я знаю, что были достигнуты большие успехи в адаптации R для обработки больших данных, так как бы вы решили эту проблему? Вот лишь несколько задач, которые я хочу выполнить:

  1. Чтение и обработка данных во фрейме данных
  2. Базовый описательный анализ, включая анализ текста (часто встречающиеся термины и т. д.)
  3. Заговор

Можно ли для этого полностью использовать R, или мне придется написать какой-нибудь Python для разбора данных и добавления их в базу данных, чтобы брать случайные выборки, достаточно маленькие, чтобы поместиться в R.

Проще говоря, любые советы или указатели, которые вы можете предоставить, будут очень признательны. Опять же, я не обижусь, если вы будете описывать решения на уровне 3-го класса.

Заранее спасибо.


person Btibert3    schedule 01.12.2011    source источник
comment
Если думать о творческом и эффективном коде становится слишком обременительно, вы можете попробовать использовать для обработки данных более крупный компьютер. Примерно за 2 доллара в час вы можете арендовать у Amazon экземпляр Linux с 68 ГБ ОЗУ. Благодаря хорошим людям из Bioconductor, вы можете использовать один из предварительно настроенных AMI с уже установленной достаточно актуальной версией R и даже с легкостью настроить веб-интерфейс RStudio. Подробности здесь   -  person Chase    schedule 01.12.2011
comment
Спасибо за это, я не знал о настройке Bioconductor, но слышал о подобных установках. Одна вещь, с которой я борюсь, заключается в том, что данные, находящиеся на моем компьютере, обрабатываются быстрее с помощью внешних компьютеров, к которым я подключаюсь через Интернет. Кроме того, позволит ли это мне загружать и обрабатывать все 10 ГБ данных с помощью R на моей машине?   -  person Btibert3    schedule 01.12.2011
comment
когда я работал с EC2, я перемещал свои данные в облако через scp или аналогичные протоколы. Тогда данные и код находятся в одном месте. Итак, мой рабочий процесс выглядит следующим образом: 1. запустить EC2, 2. переместить данные и код в EC2, 3. запустить симуляцию, 4. получить все вышеперечисленное и закрыть экземпляр EC2. Я знаю, что вы также можете воспользоваться сервисом Amazon S3 для размещения/хранения ваших данных и обмена данными с EC2, хотя мне пока не нужно было идти по этому пути.   -  person Chase    schedule 01.12.2011
comment
Спасибо за отличный ответ о рабочем процессе!   -  person Btibert3    schedule 01.12.2011
comment
Лучшее решение — загрузить файл json, преобразовать его в data.frame и вставить в базу данных MySQL. Таким образом, вы избежите создания файла размером 10 ГБ, а затем сможете запросить БД.   -  person marbel    schedule 05.11.2013
comment
У меня есть несколько сжатых с помощью gzip наборов данных в S3 размером от десятков до сотен ГБ каждый. Мой план состоит в том, чтобы загрузить данные в Spark в EC2, использовать SparkR из R (также в EC2) для вызова Spark SQL, который выполняет некоторые манипуляции и агрегации, а затем добавить фрагменты, достаточно маленькие, чтобы я мог сделать все остальное с данными. таблица в R. Кто-нибудь пробовал что-то подобное?   -  person dnlbrky    schedule 09.10.2014


Ответы (4)


Если вам нужно работать сразу со всем 10-гигабайтным файлом, то я поддерживаю мнение @Chase о приобретении более крупного, возможно, облачного компьютера.

(API потоковой передачи Twitter возвращает довольно объемный объект: один твит длиной 140 символов может весить пару килобайт данных. Вы можете уменьшить нагрузку на память, если предварительно обработаете данные вне R, чтобы извлечь только то содержимое, которое вам нужно, например имя автора. и текст твита.)

С другой стороны, если ваш анализ позволяет сегментировать данные — например, вы хотите сначала сгруппировать твиты по автору, дате/времени и т. д. — вы можете рассмотреть возможность использования Hadoop для управления R.

Конечно, Hadoop повлечет за собой некоторые накладные расходы (как на настройку кластера, так и на изучение базовой модели MapReduce); но если вы планируете выполнять много работы с большими данными, вы, вероятно, все равно захотите использовать Hadoop в своем наборе инструментов.

Пара указателей:

  • пример в главе 7 Parallel R показывает как настроить R и Hadoop для крупномасштабного анализа твитов. В примере используется пакет RHIPE, но концепции применимы к любой работе Hadoop/MapReduce.

  • вы также можете получить кластер Hadoop через AWS/EC2. Воспользуйтесь Elastic MapReduce для создания кластера по требованию или используйте Whirr, если вам нужно больше контроля над ваше развертывание Hadoop.

person qethanm    schedule 02.12.2011
comment
Хороший ответ. Просто предложение: хорошо раскрывать, если вы являетесь автором работы, которую вы цитируете. :) - person Iterator; 31.12.2011
comment
@qethanm Есть ли у вас какие-либо предложения о том, что было бы хорошей бесплатной альтернативой Hadoop, совместимой с HIPPA? В настоящее время мои данные составляют 10 ^ 13, но в зависимости от исследовательского вопроса наш окончательный анализ может включать только часть исходных данных. - person Meli; 17.06.2016

Существует совершенно новый пакет под названием colbycol, который позволяет вам считывать из огромных текстовых файлов только те переменные, которые вам нужны:

http://colbycol.r-forge.r-project.org/

Функция read.table остается основной функцией импорта данных в R. Эта функция неэффективна с точки зрения памяти и, по некоторым оценкам, требует в три раза больше памяти, чем размер набора данных, чтобы прочитать его в R.

Причина такой неэффективности заключается в том, что R хранит data.frames в памяти в виде столбцов (data.frame — это не более чем список векторов одинаковой длины), тогда как текстовые файлы состоят из строк записей. Следовательно, read.table R должен читать целые строки, обрабатывать их по отдельности, разбивая на токены и транспонируя эти токены в структуры данных, ориентированные на столбцы.

Подход ColByCol эффективно использует память. Используя код Java, tt читает входной текстовый файл и выводит его в несколько текстовых файлов, каждый из которых содержит отдельный столбец исходного набора данных. Затем эти файлы считываются в R по отдельности, что позволяет избежать узкого места в памяти R.

Этот подход лучше всего работает для больших файлов, разделенных на множество столбцов, особенно когда эти столбцы могут быть преобразованы в эффективные для памяти типы и структуры данных: R-представление чисел (в некоторых случаях) и вектора символов с повторяющимися уровнями через множители занимают гораздо меньше места, чем представление их персонажей.

Пакет ColByCol был успешно использован для чтения наборов данных объемом несколько ГБ на ноутбуке с 2 ГБ памяти.

person Ari B. Friedman    schedule 27.04.2012

10 ГБ JSON довольно неэффективны для хранения и анализа. Вы можете использовать RJSONIO для эффективного чтения. Затем я бы создал файл с отображением памяти. Вы можете использовать bigmemory (мой любимый) для создания различных типов матриц (символьных, числовых и т. д.) или хранить все в одном месте, например. используя версии HDF5 или SQL-esque (например, см. RSQlite).

Что будет интереснее, так это количество строк данных и количество столбцов.

Что касается другой инфраструктуры, например. EC2, это полезно, но подготовка файла с отображением памяти объемом 10 ГБ на самом деле не требует большой инфраструктуры. Я подозреваю, что вы работаете всего с несколькими десятками миллионов строк и несколькими столбцами (помимо фактического текста твита). С этим легко справиться на ноутбуке благодаря эффективному использованию файлов с отображением памяти. Выполнение сложной статистики потребует либо большего количества аппаратного обеспечения, более разумного использования знакомых пакетов и/или экспериментов с некоторыми незнакомыми пакетами. Я бы рекомендовал задать более конкретный вопрос, когда вы достигнете этого этапа. Первый этап такой работы — это просто нормализация данных, их хранение и поиск. Мой ответ на это прост: файлы с отображением памяти.

person Iterator    schedule 05.12.2011

Чтобы прочитать фрагменты файла JSON, вы можете использовать функцию scan(). Взгляните на аргументы skip и nlines. Я не уверен, какую производительность вы получите по сравнению с использованием базы данных.

person Paul Hiemstra    schedule 01.12.2011