Parece que Wes pode ter descoberto um problema conhecido data.table
quando o número de seqüências únicas ( níveis ) é grande: 10.000.
Será que Rprof()
revelam a maior parte do tempo gasto na chamadasortedmatch(levels(i[[lc]]), levels(x[[rc]])
? Esta não é realmente a junção em si (o algoritmo), mas uma etapa preliminar.
Esforços recentes foram feitos para permitir colunas de caracteres nas chaves, o que deve resolver esse problema, integrando-se mais de perto com a própria tabela de hash de cadeia global de R. Alguns resultados de benchmark já são relatados portest.data.table()
mas esse código ainda não está conectado para substituir os níveis pelos níveis correspondentes.
Os pandas são mesclados mais rapidamente do que data.table
nas colunas inteiras regulares? Essa deve ser uma maneira de isolar o algoritmo em si versus questões de fatores.
Além disso, data.table
tem séries temporais em mente. Dois aspectos: i) chaves ordenadas por várias colunas , como (id, datetime); ii) junção predominante rápida (roll=TRUE
), ou seja, a última observação levada adiante.
Precisarei de algum tempo para confirmar, pois é a primeira vez que vejo a comparação data.table
como apresentada.
ATUALIZAÇÃO da data.table v1.8.0 lançada em julho de 2012
- A função interna classificadamatch () foi removida e substituída por chmatch () ao corresponder os níveis i aos níveis x das colunas do tipo 'fator'. Essa etapa preliminar estava causando uma desaceleração significativa (conhecida) quando o número de níveis de uma coluna de fator era grande (por exemplo,> 10.000). Exacerbado nos testes de união de quatro dessas colunas, como demonstrado por Wes McKinney (autor do pacote Pandas do Python). A correspondência de 1 milhão de strings, das quais 600.000 são únicas, agora é reduzida de 16s para 0,5s, por exemplo.
também nessa versão foi:
colunas de caracteres agora são permitidas em chaves e são preferidas ao fator. data.table () e setkey () não obrigam mais o caractere a fatorar. Fatores ainda são suportados. Implementa FR # 1493, FR # 1224 e (parcialmente) FR # 951.
Novas funções chmatch () e% chin%, versões mais rápidas de match () e% em% para vetores de caracteres. O cache interno de string de R é utilizado (nenhuma tabela de hash é criada). Eles são cerca de 4 vezes mais rápidos que match () no exemplo em? Chmatch.
Em setembro de 2013, data.table é a v1.8.10 no CRAN e estamos trabalhando na v1.9.0. NEWS é atualizado ao vivo.
Mas como eu escrevi originalmente, acima:
data.table
tem séries temporais em mente. Dois aspectos: i) chaves ordenadas por várias colunas , como (id, datetime); ii) junção prevalecente rápida ( roll=TRUE
), ou seja, a última observação levada adiante.
Portanto, a junção equi do Pandas de duas colunas de caracteres provavelmente ainda é mais rápida que a tabela de dados. Desde que soa como hashes as duas colunas combinadas. data.table não hash a chave porque tem em mente as junções ordenadas predominantes. Uma "chave" em data.table é literalmente apenas a ordem de classificação (semelhante a um índice em cluster no SQL; ou seja, é assim que os dados são ordenados na RAM). Na lista é adicionar chaves secundárias, por exemplo.
Em resumo, a diferença de velocidade evidente destacada por esse teste específico de coluna de dois caracteres com mais de 10.000 strings exclusivas não deve ser tão ruim agora, já que o problema conhecido foi corrigido.
data.table
apenas herdadata.frame
, mas depende do código C sob o capô.