Görünüşe göre Wes data.table
, benzersiz dize ( düzey ) sayısı büyük olduğunda bilinen bir sorunu keşfetmiş olabilir : 10,000.
Rprof()
Çağrıda harcanan zamanın çoğunu ortaya çıkarıyor mu sortedmatch(levels(i[[lc]]), levels(x[[rc]])
? Bu gerçekten birleştirmenin kendisi (algoritma) değil, bir ön adım.
Son çabalar, anahtarların karakter sütunlarına izin vermeye başladı ve bu da R'nin kendi global dize karma tablosuyla daha yakından bütünleşerek bu sorunu çözmeli. Bazı kıyaslama sonuçları zaten tarafından rapor edilmiştir, test.data.table()
ancak seviyeler eşleşen seviyelere geçmek için bu kod henüz bağlanmamıştır.
Pandalar birleştirme data.table
normal tamsayı sütunlarına göre daha mı hızlı ? Bu, algoritmanın kendisini faktör sorunlarına karşı izole etmenin bir yolu olmalıdır.
Ayrıca, data.table
sahip zaman serisi birleştirme aklında. Bunun iki yönü: i) (id, datetime) gibi çok sütunlu sıralı anahtarlar ii) hızlı devam eden birleştirme ( roll=TRUE
), yani son gözlem.
data.table
Sunulan karşılaştırmayı ilk gördüğüm için onaylamak için biraz zamana ihtiyacım olacak .
Temmuz 2012'de yayınlanan data.table v1.8.0 sürümünden GÜNCELLEME
- İç işlev sortmatch () kaldırıldı ve 'düzey' türündeki sütunlar için i düzeylerini x düzeyleriyle eşleştirirken chmatch () ile değiştirildi. Bu ön adım, bir faktör sütununun seviyesi büyük olduğunda (örneğin> 10.000) (bilinen) önemli bir yavaşlamaya neden oluyordu. Wes McKinney (Python paket Pandas'ın yazarı) tarafından gösterildiği gibi, bu tür dört sütuna katılma testlerinde şiddetlendi. Örneğin, 600.000'i benzersiz olan 1 milyon dizeyi eşleştirmek artık 16 saniyeden 0,5 saniyeye düşürüldü.
ayrıca bu sürümde:
karakter sütunlarına artık anahtarlarda izin veriliyor ve çarpanlara tercih ediliyor. data.table () ve setkey () artık karakteri faktöre zorlamaz. Faktörler hala desteklenmektedir. FR # 1493, FR # 1224 ve (kısmen) FR # 951'i uygular.
Yeni fonksiyonlar chmatch () ve% chin%, daha hızlı eşleşme () sürümleri ve% vektörleri için karakter vektörleri. R'nin dahili dize önbelleği kullanılır (karma tablosu oluşturulmaz). ? Chmatch örneğindeki match () yönteminden yaklaşık 4 kat daha hızlıdırlar.
Eylül 2013 itibariyle data.table, CRAN üzerinde v1.8.10 ve v1.9.0 üzerinde çalışıyoruz. HABER canlı olarak güncellenir.
Ama aslen yazdığım gibi, yukarıda:
data.table
sahiptir zaman serileri birleştirme aklında. Bunun iki yönü: i) (id, datetime) gibi çok sütunlu sıralı anahtarlar ii) hızlı devam eden birleştirme ( roll=TRUE
), yani son gözlem.
Bu nedenle, Pandalar equi iki karakter sütununun birleşimi muhtemelen verilerden daha hızlıdır. Kulağa kombine iki sütun hash gibi görünüyor. data.table, anahtarda hash vermez, çünkü geçerli siparişleri akılda tutar. Data.table içindeki bir "anahtar", kelimenin tam anlamıyla sadece sıralama düzenidir (SQL'deki kümelenmiş bir dizine benzer; yani, veri RAM'de bu şekilde sıralanır). Listede, örneğin ikincil anahtarlar eklenecektir.
Özetle, 10.000'den fazla benzersiz dizeyle bu özel iki karakterli sütun testi ile vurgulanan göze çarpan hız farkı, bilinen sorun düzeltildiğinden, şimdi o kadar kötü olmamalıdır.
data.table
sadece miras alırdata.frame
, ancak kaputun altındaki C koduna dayanır.