Я достиг предела RAM в анализе больших наборов данных в R. Я думаю, что мой следующий шаг должен импортировать эти данные в базу данных MySQL и использовать RMySQL
пакет. В основном, потому что я не знаю малопонятный жаргон базы данных, я не смог выяснить, как добраться вне установки MySQL с часами поиска с помощью Google и RSeeking (я выполняю MySQL и MySQL Workbench на Mac OSX 10.6, но могу также запустить Ubuntu 10.04).
Существует ли хорошая ссылка о том, как начать с этим использованием? В этой точке я не хочу делать любой вид реляционного databasing. Я просто хочу импортировать .csv файлы в локальную базу данных MySQL и выполнить в подмножестве с RMySQL
.
Я ценю любые указатели (включая, "Вы - путь от основы!" поскольку я плохо знаком с R и более плохо знаком с большими наборами данных... это приблизительно 80 МБ),
Документация для RMySQL довольно хороша, но предполагает что вы знаете основы SQL. Это:
Шаг 1 прост: в консоли MySQL просто «создать базу данных DBNAME» ". Или из командной строки используйте mysqladmin , или часто есть графические интерфейсы администратора MySQL.
Шаг 2 немного сложнее, так как вы должны указать поля таблицы и их тип. Это будет зависеть от содержимого вашего файла CSV (или другого файла с разделителями). Простой пример будет выглядеть примерно так:
use DBNAME;
create table mydata(
id INT(11) NOT NULL AUTO_INCREMENT PRIMARY KEY,
height FLOAT(3,2)
);
В котором говорится о создании таблицы с двумя полями: id , который будет первичным ключом (поэтому должен быть уникальным) и будет автоматически увеличиваться при добавлении новых записей; и высота , которая здесь указана как число с плавающей запятой (числовой тип), с 3 цифрами всего и 2 после десятичной точки ( например, 100,27). Важно понимать типы данных .
Шаг 3 - есть разные способы импортировать данные в таблицу. Один из самых простых - использовать утилиту mysqlimport . В приведенном выше примере, если предположить, что ваши данные находятся в файле с тем же именем, что и таблица (mydata), первый столбец представляет собой символ табуляции, а второй - переменную высоты (без строки заголовка), это будет работать:
mysqlimport -u DBUSERNAME -pDBPASSWORD DBNAME mydata
Шаг 4 - требуется, чтобы вы знали, как выполнять запросы MySQL.Снова простой пример:
select * from mydata where height > 50;
Означает «извлечь все строки (id + height) из таблицы mydata, где высота больше 50».
Освоив эти основы, вы можете переходить к более сложным примерам, таким как создание 2 или более таблиц и выполнение запросов, которые объединяют данные из каждой.
Затем вы можете обратиться к руководству по RMySQL. В RMySQL вы настраиваете соединение с базой данных, а затем используете синтаксис запроса SQL для возврата строк из таблицы в качестве фрейма данных. Так что действительно важно, чтобы вы получили часть SQL - часть RMySQL проста.
В сети есть куча руководств по MySQL и SQL, включая «официальное» учебное пособие на веб-сайте MySQL. Просто выполните поиск в Google "учебник по mysql".
Лично я вообще не считаю 80 МБ большим набором данных; Я удивлен, что это вызывает проблему с оперативной памятью, и я уверен, что встроенные функции R могут справиться с этим довольно легко. Но хорошо изучать новые навыки, такие как SQL, даже если они вам не нужны для решения этой задачи.
У меня есть очень хорошее предложение. Для 80 МБ используйте SQLite. SQLite - это легковесная, сверхбыстрая база данных на основе файлов, которая работает (почти) так же, как база данных SQL. http://www.sqlite.org/index.html
Вам не нужно беспокоиться о запуске какого-либо сервера или разрешений, ваш дескриптор базы данных - это просто файл.
Кроме того, он хранит все данные в виде строки, поэтому вам даже не нужно беспокоиться о сохранении данных в виде типов (поскольку все, что вам нужно сделать, это в любом случае эмулировать одну текстовую таблицу).
Кто-то еще упомянул sqldf: http://code.google.com/p/sqldf/
, который действительно взаимодействует с SQLite: http://code.google.com/p/sqldf/#9._How_do_I_examine_the_layout_that_SQLite_uses_for_a_table?_whi
Итак, ваш оператор создания SQL будет похож на этот
create table tablename (
id INT(11) INTEGER PRIMARY KEY,
first_column_name TEXT,
second_column_name TEXT,
third_column_name TEXT
);
В противном случае объяснение neilfws довольно хорошее.
P.S. Еще немного удивлен, что ваш скрипт захлебывается 80мб. В R невозможно просто искать файл по частям, не открывая его в памяти?
Я согласен с тем, что было сказано до сих пор. Хотя я думаю, что начать работу с MySQL (базами данных) в целом - неплохая идея, если вы собираетесь иметь дело с данными. Я имею в виду, что проверил ваш профиль, где написано, что студент-аспирант по финансам. Я не знаю, означает ли это квант. финансы, но вполне вероятно, что в своей карьере вы столкнетесь с действительно большими наборами данных. Если у вас есть время, я бы порекомендовал узнать что-нибудь о базах данных. Это просто помогает. Сама документация MySQL довольно солидная, и вы можете получить много дополнительной (конкретной) помощи здесь, в SO.
Я также запускаю MySQL с рабочей средой MySQL на Mac OS X Snow Leopard. Вот что помогло мне сделать это сравнительно легко.
Я установил MAMP , который дает мне локальный веб-сервер Apache с PHP, MySQL и инструментом MySQL PHPmyadmin, который можно использовать как хорошую веб-альтернативу рабочей среде MySQL (которая не всегда очень стабильна на Mac :). У вас будет небольшой виджет для запуска и остановки серверов, а также вы сможете получить доступ к некоторым основным параметрам конфигурации (например, к портам через ваш браузер). Установить здесь можно одним щелчком мыши.
Установите Rpackage RMySQL. Я помещу сюда свою строку подключения, может быть, это поможет:
Создайте свои базы данных с помощью MySQL workbench. INT и VARCHAR (для категориальных переменных, содержащих символы) должны быть типами полей, которые вам в основном нужны в начале.
Попробуйте найти процедуру импорта, которая лучше всего подходит для вас. Я не знаю, являетесь ли вы специалистом по оболочке / терминалу - если да, вам понравится то, что было предложено neilfws.Вы также можете использовать LOAD DATA INFILE , который я предпочитаю, поскольку это только один запрос, а не INSERT INTO (построчно)
. Если вы укажете проблемы, которые у вас есть, более точно, вы получите некоторая более конкретная помощь - не стесняйтесь спрашивать;)
Я полагаю, вам придется много работать с данными временных рядов - есть проект (TSMySQL) вокруг этого использования R и реляционные базы данных (например, MySQL, но также доступные для других СУБД) для хранения данных временных рядов. Кроме того, вы даже можете подключить R к FAME (что популярно среди финансистов, но дорого). В последнем абзаце, конечно, нет ничего принципиального, но я подумал, что он может помочь вам подумать, стоит ли потрудиться, чтобы погрузиться в него немного глубже.
Пакет sqldf может дать вам более простой способ делать то, что вам нужно: http://code.google.com/p/sqldf/ . Особенно, если вы единственный, кто пользуется базой данных.
Редактировать: Вот почему я думаю, что это было бы полезно в этом случае (с веб-сайта):
С sqldf пользователь освобождается от необходимости выполнять следующие действия, которые выполняются автоматически:
См. также здесь: Быстро чтение очень больших таблиц как фреймов данных в R