Können wir die binäre Suche in der Datei data.table mit ODER-Abfragen ausführen

8

Nach der vorherigen Frage mit data.table

%Vor%

Können wir die binäre Suche verwenden, um

zu finden? %Vor%

Denken Sie daran, dass DT[J('a',25)] == DT[x=='a' & y==25]

    
statquant 24.03.2013, 11:39
quelle

1 Antwort

8

Ja:
Um eine binäre Suche zu machen, brauchen wir die entsprechenden Indizes.

%Vor%

Benchmarking :
Dies gibt uns mehr als eine 10x Verbesserung über vektorisierte Suche.

%Vor%

Der Einfachheit halber können wir den "creating the index" Teil des Codes in eine nette Funktion einfügen, damit wir es dann in einer einzigen Zeile aufrufen können. Zum Beispiel:

%Vor%

Dabei ist OrIndx() wie folgt definiert:

%Vor%

Erklärung:

Die Idee hier ist, dass die Durchführung einer "oder" -Seration eine Art von Kombination erfordert Bei einer Standardvektorsuche ist diese Kombination die Ergebnisse jedes einzelnen Vektorservers.

data.table bietet einige große Geschwindigkeitsverbesserungen, indem seraches wie

erlaubt werden %Vor%

Daher wäre eine natürliche Lösung für die Frage:

%Vor%

Das einzige Problem ist, dass das Recycling nicht richtig funktioniert.
Es wäre ideal, eine Option wie

zu haben %Vor%

Aber soweit ich das beurteilen kann, wurde das (noch nicht!) nicht umgesetzt Stattdessen können wir entsprechende Kombinationen vornehmen.
Die obige Funktion OrIndx macht genau das. (es ist schnell & amp; schmutzig und es gibt effizientere Möglichkeiten, den Index zu erstellen)

Update mit zusätzlichen Benchmarks

Gemäß @Aruns-Vorschlag enthalten wir

%Vor%

Getestet in 1e6- und 1e7-Zeilen:

%Vor%

Beachten Sie, dass bei kleinen Tables (weniger als 15K rows) die Vektorsuche schneller ist (bei wirklich kleinen Tabellen etwa doppelt so schnell)

%Vor%

Dieses Muster bleibt bis etwa 10.000 Zeilen erhalten. An diesem Punkt beginnen wir, die Verstärkungen zu sehen:

%Vor%     
Ricardo Saporta 24.03.2013, 15:59
quelle

Tags und Links