2012-07-20 14 views
17

Cuando uso el paquete data.table, no estoy seguro de cuándo necesito setkey(). Por ejemplo, cuando se usa el operador := con la opción by, las cosas parecen ser muy rápidas aunque no haya configurado una tecla. ¿Podría alguien aclarar cuándo es necesario setkey() y cuándo no? Y si no es necesario antes de llamar al := con by, entonces ¿cómo es el paquete data.table tan rápido ya que presumiblemente tiene que hacer lo mismo que apply en el estándar data.frame R haciendo una búsqueda secuencial en lugar de una binaria ya que no saber si mi data.table en realidad está ordenado por el argumento a by.setkey y el operador: =, data.table, R

Gracias

Respuesta

18

Estas 2 preguntas frecuentes parecen cerca:

3,2 que no tienen una llave en una mesa grande, pero la agrupación sigue siendo muy rápido. ¿Porqué es eso?
data.table usa clasificación de radix. Esto es significativamente más rápido que otros algoritmos de ordenación. Radix es específicamente solo para enteros, vea ?base::sort.list(x,method="radix"). Esta es también una razón por la cual setkey es rápido. Cuando no se establece ninguna tecla, o agrupamos en un orden diferente al de la clave, lo llamamos ad hoc por.

3.3 ¿Por qué la agrupación por columnas en la clave es más rápida que un ad hoc?
Debido a que cada grupo es contigua en la memoria RAM, lo que minimiza la página va a buscar, y la memoria puede ser copiado a granel (memcpy en C) en lugar de un bucle en C.

Lo que no dice, y probablemente debería hacer, es que necesita un conjunto de datos muy grande, donde cada grupo es también muy grande, antes de que note la diferencia entre "keyed by" y "ad hoc by". Algo así como 100 grupos de 100MB cada uno (una tabla de datos de 10 GB) como 1e8 filas y 13 columnas. De lo contrario, no es necesario primero setkey, especialmente porque puede ser oneroso.

+1

¡fantástico, gracias! estaba cavando a través de las preguntas frecuentes y debe haber perdido esto. – Alex

+0

¿'ad hoc by' es rápido porque también usa clasificación de radix? – colinfang

+1

@colinfang Difícil de responder esa pregunta ya que varias características entran en juego. Las razones varían según la consulta y los datos. Ad hoc 'by' usa radix sorting para encontrar los grupos para las columnas enteras, por lo que depende del tipo y cuántas columnas están 'by'-ed'. Luego, una vez que ha encontrado los grupos, una de las razones por las que la agrupación es rápida es porque la memoria se asigna para el grupo más grande una vez por adelantado, que luego se reutiliza para todos los grupos. Y solo para las columnas que necesita 'j'. Ver Preguntas frecuentes 3.1. Pruebe el modo 'verbose = TRUE' ya que revela cuánto tiempo se dedica a encontrar los grupos (ordenar inc radix) frente a iterarlos. –

Cuestiones relacionadas