Обработка и анализ больших данных в R - PullRequest
13 голосов
/ 01 декабря 2011

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

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

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

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

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

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

Ответы [ 4 ]

11 голосов
/ 02 декабря 2011

Если вам нужно обработать весь файл размером 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.

5 голосов
/ 27 апреля 2012

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

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

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

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

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

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

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

2 голосов
/ 05 декабря 2011

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

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

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

0 голосов
/ 01 декабря 2011

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

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...