2010-07-27 5 views
9

he alcanzado el límite de memoria RAM en el análisis de grandes conjuntos de datos en R. Creo que mi siguiente paso es importar estos datos en una base de datos MySQL y utilizar el paquete RMySQL. En gran parte porque no conozco la jerga de la base de datos, no he podido averiguar cómo ir más allá de la instalación de MySQL con horas de búsqueda en Google y RSeeking (estoy ejecutando MySQL y MySQL Workbench en Mac OSX 10.6, pero también puedo ejecutar Ubuntu 10.04)Establecer gran base de datos en MySQL para el análisis en I

¿Hay alguna buena referencia sobre cómo comenzar con este uso? En este punto, no quiero hacer ningún tipo de base de datos relacional. Solo quiero importar archivos .csv en una base de datos MySQL local y hacer el subconjunto con RMySQL.

Agradezco cualquier punteros (incluyendo "Estás fuera de lugar!", Como soy nuevo en R y posteriores a grandes conjuntos de datos ... éste es alrededor de 80 mb)

+2

Si va a ser el único acceso a su base de datos, SQLite puede ser una buena opción (y mucho menos complicaciones de configuración) ... Además, 80mb no parece ser un conjunto de datos muy grande. ¿Puede darnos un ejemplo en el que se quede sin memoria RAM? –

+3

De acuerdo, 80 Mb es prácticamente nada. Tal vez haya algún otro problema con su máquina o código? – neilfws

+0

@ Aaron, @Neil - Tienes razón. Mirando hacia atrás con un poco de sueño, mi conjunto de datos no es grande, simplemente más grande que lo que hice en el pasado. 80> 2, pero gb >> mb, así que tengo que revisar el código nuevamente (y aumentar mi paciencia). Gracias. –

Respuesta

6

La documentación para RMySQL es bastante bien, pero asume que sabes los conceptos básicos de SQL. Estos son:

  • creación de una base de datos
  • creación de una tabla
  • obtener datos en la tabla
  • la obtención de datos fuera de la mesa

Paso 1 es fácil: en la consola de MySQL , simplemente "crear base de datos DBNAME". O desde la línea de comandos, use mysqladmin, o con frecuencia hay GUI de administración de MySQL.

Paso 2 es un poco más difícil, ya que hay que especificar los campos de la tabla y su tipo. Esto dependerá del contenido de su archivo CSV (u otro archivo delimitado). Un ejemplo sencillo sería algo como:

use DBNAME; 
create table mydata(
    id INT(11) NOT NULL AUTO_INCREMENT PRIMARY KEY, 
    height FLOAT(3,2) 
); 

Qué dice crear una tabla con 2 campos: Identificación, que será la clave principal (por lo que tiene que ser único) y será incrementado automáticamente a medida que se agregan nuevos registros; y altura, que aquí se especifica como un flotador (un tipo numérico), con 3 dígitos total y 2 después del punto decimal (por ejemplo 100,27). Es importante que entienda data types.

Paso 3: hay varias formas de importar datos a una tabla. Una de las más fáciles es usar la utilidad mysqlimport. En el ejemplo anterior, en el supuesto de que sus datos están en un archivo con el mismo nombre que la tabla (misdatos), la primera columna de un carácter de tabulación y el segundo la variable altura (sin línea de encabezamiento), esto funcionaría:

mysqlimport -u DBUSERNAME -pDBPASSWORD DBNAME mydata 

Paso 4 - requiere que usted sabe cómo ejecutar consultas MySQL. De nuevo, un ejemplo simple:

select * from mydata where height > 50; 

significa "recuperar todas las filas (id + altura) de la mydata mesa donde la altura es más de 50".

Una vez que domine los conceptos básicos, puede pasar a ejemplos más complejos, como la creación de 2 o más tablas y ejecutar consultas que unen los datos de cada uno.

Luego, puede consultar el manual de RMySQL.En RMySQL, configura la conexión de la base de datos, luego utiliza la sintaxis de la consulta SQL para devolver las filas de la tabla como un marco de datos. Por lo tanto, es importante que obtenga la parte SQL, la parte RMySQL es fácil.

Hay montones de tutoriales de MySQL y SQL en la web, incluido el tutorial "oficial" en el sitio web de MySQL. Solo busca en Google "tutorial de mysql".

Personalmente, no considero que 80 Mb sean un gran conjunto de datos; Me sorprende que esto esté causando un problema de RAM y estoy seguro de que las funciones R nativas pueden manejarlo con bastante facilidad. Pero es bueno aprender nuevas habilidades como SQL, incluso si no las necesitas para este problema.

+0

@ Neil - ¡Gracias por los consejos! Los pasos 1-3 me estaban evadiendo, en gran parte porque estaba obsesionado con MySQL Workbench (y no creo que pueda hacer esto desde allí). –

2

El paquete sqldf puede darle una manera más fácil de hacer lo que necesita: http://code.google.com/p/sqldf/. Especialmente si usted es la única persona que usa la base de datos.

Editar: Aquí es por eso que creo que sería útil en este caso (de la página web):

Con sqldf el usuario se libera de tener que hacer lo siguiente, todas las cuales se realiza de forma automática:

  • configuración de base de datos
  • escribir la instrucción create table que define cada mesa
  • importación y exportación desde y hacia la base de datos
  • coacción de las columnas devueltas a la clase apropiada en casos comunes

Ver también aquí: Quickly reading very large tables as dataframes in R

+2

sqldf es bueno, si conoce SQL. Aunque, cuando le dices a los gurús acerca de sqldf, simplemente te miran como si estuvieras enojado. Hay funciones R nativas para "unir" y marcos de datos de subconjuntos; sqldf es para las personas que saben mejor que SQL R. – neilfws

+1

sqldf también automatiza la configuración de una base de datos de un archivo grande y te permite importar fácilmente los datos de ella, que resuelve el problema de la memoria RAM. –

+0

¡La respuesta de JD Long podría ser justo lo que necesito! ¡Hoy probaré tanto SQLdf como RMySQL! ¡Gracias por tu ayuda! –

5

tengo una muy buena sugerencia. Para 80MB use SQLite. SQLite es una base de datos súper rápida, súper rápida, ligera y de dominio público que funciona (casi) como una base de datos SQL. http://www.sqlite.org/index.html

No tiene que preocuparse por ejecutar ningún tipo de servidor o permisos, su manejador de base de datos es solo un archivo.

Además, almacena todos los datos como una cadena, por lo que ni siquiera tiene que preocuparse de almacenar los datos como tipos (ya que todo lo que tiene que hacer es emular una sola tabla de texto de todos modos).

Alguien sqldf más mencionado: http://code.google.com/p/sqldf/

que no interactúan con SQLite: http://code.google.com/p/sqldf/#9._How_do_I_examine_the_layout_that_SQLite_uses_for_a_table?_whi

Así que su SQL instrucción create sería como este

create table tablename (
    id INT(11) INTEGER PRIMARY KEY, 
    first_column_name TEXT, 
    second_column_name TEXT, 
    third_column_name TEXT 
); 

De lo contrario, la explicación neilfws' es una bastante bueno.

P.S. También estoy un poco sorprendido de que tu script se esté ahogando en 80mb. ¿No es posible en R buscar el archivo en bloques sin abrirlo todo en la memoria?

1

Estoy de acuerdo con lo que se ha dicho hasta ahora. Aunque supongo que comenzar con MySQL (bases de datos) en general no es una mala idea por mucho tiempo si vas a tratar con datos. Quiero decir que verifiqué tu perfil, que dice finanzas estudiante de doctorado. No sé si eso significa quant.finanzas, pero es probable que encuentre conjuntos de datos realmente grandes en su carrera. Si puede permitirse algo de tiempo, le recomendaría que aprendiera algo acerca de las bases de datos. Simplemente ayuda. La documentación de MySQL en sí es bastante sólida y puede obtener mucha ayuda adicional (específica) aquí en SO.

corro MySQL con MySQL Workbench en Mac OS X Snow Leopard también. Así que esto es lo que me ayudó a hacerlo de manera comparativamente fácil.

  • He instalado MAMP, que da a mi un servidor web Apache local con PHP, MySQL y la herramienta MySQL phpMyAdmin, que puede ser utilizado como una alternativa basada en la web agradable para MySQL Workbench (que no siempre es super estable en un Mac :). Tendrás un pequeño widget para iniciar y detener servidores y puedes acceder a algunas configuraciones básicas (como puertos a través de tu navegador). Es realmente instalar con un solo clic aquí.

  • Instalar el Rpackage RMySQL. Voy a poner mi cadena de conexión aquí, tal vez eso ayuda:

  • Crear bases de datos con MySQL Workbench. INT y VARCHAR (para variables categóricas que contienen caracteres) deberían ser los tipos de campo que básicamente necesitas al principio.

  • Trata de encontrar la rutina de importación que funciona mejor para usted. No sé si eres un tipo concha/terminal; si es así, te gustará lo que sugirió neilfws. También es posible usar LOAD DATA INFILE que es yo prefiero, ya que es sólo una consulta en lugar de INSERT INTO (línea por línea)

Si especifica los problemas que tiene con mayor precisión, obtendrá un poco de ayuda más específica - Así que siéntete libre de preguntar;)

Supongo que tienes que trabajar mucho con time series data - hay un project (TSMySQL) que usa R y bases de datos relacionales (como MySQL, pero también está disponible para otros DBMS) para almacenar series temporales datos. Además, puede incluso conectar R a FAME (que es popular entre los financiadores, pero costoso). El último párrafo ciertamente no es nada básico, pero pensé que podría ayudarte a considerar si vale la pena el esfuerzo para profundizar un poco más.

+0

¡Gracias por los indicadores de Mac! Creo que los pasos 1-3 de Neil me ayudarán, pero volveré si hay fallas en Mac. Y no todas las finanzas son cuantitativas? ;) –

+0

@richardh, no sé acerca de la parte financiera, eres el experto;). –

0

Practical Computing for Biologists como una introducción (de materias específicas sin embargo) agradable a SQLite

Capítulo 15. Organización de datos y bases de datos

Cuestiones relacionadas