La forma más rápida de subconjunto-data.table vs. MySQL
rmysql (2)
No soy un usuario R, pero sé un poco acerca de las bases de datos. Creo que MySQL (o cualquier otro RDBMS con buena reputación) en realidad realizará sus operaciones de subconjunto más rápido (como, por lo general, un orden de magnitud, por lo general) a excepción de cualquier cálculo adicional involucrado en el proceso de subconjunto.
Sospecho que su retraso en el rendimiento en pequeños conjuntos de datos está relacionado con el costo de la conexión y el impulso inicial de los datos a MySQL. Es probable que haya un punto en el que la sobrecarga de la conexión y el tiempo de transferencia de datos aumenten más el costo de su operación de lo que MySQL le está ahorrando.
Sin embargo, para conjuntos de datos más grandes que un cierto mínimo, parece que este costo se compensa con la velocidad de la base de datos.
Mi entendimiento es que SQL puede lograr la mayoría de las operaciones de recuperación y clasificación mucho más rápidamente que las operaciones iterativas en código. Pero uno debe tener en cuenta el costo de la conexión y (en este caso) la transferencia inicial de datos a través del cable de red.
Me interesará escuchar lo que otros tienen que decir. . .
Soy un usuario de R, y con frecuencia encuentro que necesito escribir funciones que requieran subcontratar grandes conjuntos de datos (10s de millones de filas). Cuando aplico estas funciones en un gran número de observaciones, puede llevar mucho tiempo si no cuido de cómo lo implemento.
Para hacer esto, a veces he usado el paquete data.table, y esto proporciona velocidades mucho más rápidas que el subconjunto con marcos de datos. Recientemente, comencé a experimentar con paquetes como RMySQL, enviando algunas tablas a mysql y utilizando el paquete para ejecutar consultas de SQL y obtener resultados.
He encontrado mejoras en el rendimiento mixto. Para conjuntos de datos más pequeños (millones), parece que cargar los datos en una tabla de datos y configurar las claves correctas hace que el subconjunto sea más rápido. Para conjuntos de datos más grandes (10s a 100s de millones), parece que el envío de una consulta a mysql se mueve más rápido.
¿Se preguntaba si alguien tiene alguna idea de qué técnica debería devolver consultas simples de subconjunto o agregación más rápidamente, y si esto debería depender o no del tamaño de los datos? Entiendo que configurar claves en data.table es algo similar a crear un índice, pero no tengo mucha más intuición más allá de eso.
Si los datos caben en la memoria RAM, data.table es más rápido. Si proporciona un ejemplo, probablemente se hará evidente, rápidamente, que está utilizando mal los datos. ¿Has leído los "hacer y no hacer" en el wiki de data.table ?
SQL tiene un límite inferior porque es un almacén de fila. Si los datos caben en la RAM (y 64 bits es bastante), data.table es más rápido no solo porque está en la RAM sino porque las columnas están contiguas en la memoria (minimizando las capturas de página de RAM a L2 para las operaciones de columnas). Use data.table correctamente y debería ser más rápido que el límite inferior de SQL. Esto se explica en la FAQ 3.1. Si está viendo más lento con data.table, entonces es muy probable que esté usando data.table incorrectamente (o hay un error de rendimiento que debemos corregir). Entonces, por favor, publique algunas pruebas, después de leer el wiki de data.table.