2011-01-13 9 views
1

Ich frage mich, ob es eine Datenstruktur gibt, die so optimiert ist, dass sie Frequenzen gegen Daten zählt, die in einem datenbanktabellenähnlichen Format gespeichert sind. Beispielsweise werden die Daten in einem (Komma) begrenzten Format darunter angezeigt.Datenstruktur zum Zählen von Häufigkeiten in einem Datenbanktabellen-ähnlichen Format

Jetzt möchte ich einfach die Häufigkeit von col1 = x oder col1 = x und col2 = grün zählen. Ich habe die Daten in einer Datenbanktabelle gespeichert, aber in meinem Profiling und von der empirischen Beobachtung ist Datenbankverbindung der Flaschenhals. Ich habe versucht, In-Memory-Datenbank-Lösungen zu verwenden, und das funktioniert ganz gut; Das einzige Problem sind Speicheranforderungen und skurrile Init/Destroy-Aufrufe.

auch, ich arbeite hauptsächlich mit Java, aber habe Erfahrung mit .net und fragte mich, ob es irgendwelche API gab, mit "tabular" Daten in einer linq Weise mit Java zu arbeiten.

jede Hilfe wird geschätzt.

+0

Wie verwenden Sie die Datenbank? Mit den richtigen Abfragen sollte die Datenbank für das, was Sie tun, gut funktionieren ... –

+0

Ich erstelle einfach eine Datenbanktabelle. Ich weiß, dass es Möglichkeiten gibt, Abfragen zu optimieren (d. h. mit Indizes), aber sie unterscheiden sich von Datenbank zu Datenbank. Außerdem gibt es keine Möglichkeit zu ermitteln, welche Indizes erstellt werden sollen (auf welchen Spalten oder Spaltenkombinationen), da die Algorithmen zur Laufzeit bestimmen, welche Spalten korreliert sind. Außerdem akzeptiert das Programm jeden tabellarischen Datensatz als Eingabe, also erzeuge ich die Datenbanktabellen zur Laufzeit. – jake

Antwort

0

Wie wäre es mit einer verschachtelten TreeMap? Zum Beispiel, sagen Sie die folgenden Datensätze haben: „Wie oft haben col1 den Wert v haben“

col1=v, col2=v2 
col1=v, col2=v3 

Sie wollen die Struktur abfragen zu können und fragen,

würde ich den folgenden Code verwenden, um Werte in die Struktur einzufügen:

TreeMap tm = new TreeMap(); 
//the map hasn't seen this column name yet 
if(!tm.containsKey(columnName)){ 
    //mark the column value as being seen once 
    tm.put(columnName, (new TreeMap()).put(colVal, 1)); 
}else{ 
    //the map has seen the column name. 
    TreeMap valueMap = tm.get(columnName); 
    if(valueMap.containsKey(colVal)){ 
     //we've seen this column value before. 
     //Increment the number of times we've seen it 
     int valCount = valueMap.get(colVal); 
     valueMp.put(colVal, valCount++); 
    }else{ 
     //we've have not seen this column value before. 
     valueMap.put(colVal, 1); 
    } 
} 
+0

Ich habe Karten von Karten versucht, dieses Problem vorher anzugehen. Es ist sehr langsam und kann unerschwingliche Speicheranforderungen erfordern. Wenn zum Beispiel jede Spalte zwei Werte hat und wir 10 Spalten haben, sind die Kombinationen 2^10. – jake

+0

In dieser Implementierung würde es jedoch nicht 2^10 Einträge geben. In diesem Code gibt es 10 Einträge im Baum der obersten Ebene (1 Eintrag für jeden eindeutigen Spaltennamen). Jeder Knoten des obersten Baums enthält eine einzelne TreeMap, die zwei Einträge enthält (einen für jeden Wert). In diesem Fall hätten wir 20 Einträge (jede der 10 Spalten hat zwei Werte). – Davidann

0

Es gibt eine Multiset Datenstruktur, die den Überblick über die Frequenzen für Sie hält. Hier ist der Beispielcode, der diese Datenstruktur verwendet (aus google-guava).

void frequencyCounter() 
{ 
    Multiset<String> counter = HashMultiset.create(); 

    counter.add("col1" + "=" + "x"); 
    counter.add("col2" + "=" + "x"); 
    counter.add("col2" + "=" + "x"); 

    System.out.println("how many times did col2 have the value x?"); 
    System.out.println(counter.count("col2" + "=" + "x")); 
} 

Punkte zu beachten.

  • Ich bin verketten die Spaltennamen (col1) und seinen Wert (x) mit (=) als das Trennzeichen, während auf das für das wiederhole ich den gleichen Prozess zu Check Multiset
  • Hinzufügen Frequenz a
    bestimmter Wert in einer gegebenen Spalte
+0

Wenn ich das Multiset-Objekt/Klasse verwendet habe, glaube ich nicht, dass es funktionieren würde. weil jedes Add eine solche Zeichenfolge hinzufügen würde ("col1 = x, col2 = y, col3 = grün"). und dann würde ich zählen müssen, um einen Filter wie diese zu berechnen 1) col1 = x, 2) col1 = y und col2 = x, oder 3) col3 = grün, col2 = x.Beachten Sie, dass Spalte-Ordnungen nicht wichtig sind, und wie ich die Filter erstelle, kann col3 vor col1 oder col2 setzen. – jake

+0

@ user373312 Sie sagen also, dass Sie ("col1 = x, col2 = y, col3 = grün") als Schlüssel verwenden möchten? –

Verwandte Themen