- Registriert
- 20.04.08
- Beiträge
- 202
Tach Leute,
ich hänge an einer etwas kniffligen Aufgabe und hoffe auf Eure Unterstützung.
Ich habe 1-N Objekte mit X Variablen als Ausprägung, z.B.:
[Auto] wird durch folgende Attribute charakterisiert:
{Farbe, Leistung, Gewicht, Zylinder}
Die Anzahl der Objekte nimmt mit der Zeit immer mehr zu; ich rede hier nicht von einigen Tausend sondern später mehrere (hundert) Millionen bis Milliarden Entries, wobei die Merkmalsausprägungen konstant von der Anzahl bleiben und metrisch skaliert sind (jeweils von 0 bis 9).
Nun müssen nachts per Batch entsprechende Ähnlichkeitsmaße berechnet werden; hierzu wird die Minkowski-Metrik mit r = 2 (eukl. Distanz) benutzt (s. http://www.statistics4u.com/fundstat_germ/cc_distance_meas.html)
So, programmatisch habe ich das ganze bereits umgesetzt, d.h. für eine Anzahl von n = 100 oder n = 10000 funktioniert das ganze einwandfrei.
Das Problem liegt jetzt natürlich darin, dass die Matrix der Distanzmaße N X N Zeilen bzw. Spalten groß wird, da diese Matrix symmetrisch ist.
Ich hab das mal vesucht auf die Spitze zu treiben: Auf einem 32 Bit-System allokiert Java für mich 1,5 GB Arbeitsspeicher.
Jede Spalte in der Matrix (32-buchstabiger hash-Wert (MD5)) nimmt jetzt 32 Byte ein; da die Matrix symmetrisch ist also 64 Byte und für die Ähnlichkeiten habe ich mal maximal 4 Byte angenommen; heißt pro Spalte und Zeile fallen 68 Byte an.
Wenn mir im Speicher 1610612736 Bytes (1,5 GB) zur Verfügung stehen und ich davon ausgehe, dass meine Matrix nach der Virtual Machine (ich arbeite in Java, aber auch in C++ wäre das Problem ähnlich, natürlich mit leichten oder größeren Verschiebungen) vllt. 1,45 GB nutzen kann, stehen mir 1556925644,80 Byte zur Verfügung.
So, das ergibt maximal eine 228.959.653 x 228959653 Matrix (eventueller programmatischer Overhead nicht mit einberechnet).
Das sind Pi mal Daumen max. 228 Millionen Einträge; Abgesehen von einer miesen Performance müßte ich dazu in der Lage sein, deutlich mehr Distanzmaße zu speichern.
Wie würdet ihr das regeln? Gibt es dafür sowas wie best practices?
Danke schonmal vorab und einen schönen Samstag abend!
ich hänge an einer etwas kniffligen Aufgabe und hoffe auf Eure Unterstützung.
Ich habe 1-N Objekte mit X Variablen als Ausprägung, z.B.:
[Auto] wird durch folgende Attribute charakterisiert:
{Farbe, Leistung, Gewicht, Zylinder}
Die Anzahl der Objekte nimmt mit der Zeit immer mehr zu; ich rede hier nicht von einigen Tausend sondern später mehrere (hundert) Millionen bis Milliarden Entries, wobei die Merkmalsausprägungen konstant von der Anzahl bleiben und metrisch skaliert sind (jeweils von 0 bis 9).
Nun müssen nachts per Batch entsprechende Ähnlichkeitsmaße berechnet werden; hierzu wird die Minkowski-Metrik mit r = 2 (eukl. Distanz) benutzt (s. http://www.statistics4u.com/fundstat_germ/cc_distance_meas.html)
So, programmatisch habe ich das ganze bereits umgesetzt, d.h. für eine Anzahl von n = 100 oder n = 10000 funktioniert das ganze einwandfrei.
Das Problem liegt jetzt natürlich darin, dass die Matrix der Distanzmaße N X N Zeilen bzw. Spalten groß wird, da diese Matrix symmetrisch ist.
Ich hab das mal vesucht auf die Spitze zu treiben: Auf einem 32 Bit-System allokiert Java für mich 1,5 GB Arbeitsspeicher.
Jede Spalte in der Matrix (32-buchstabiger hash-Wert (MD5)) nimmt jetzt 32 Byte ein; da die Matrix symmetrisch ist also 64 Byte und für die Ähnlichkeiten habe ich mal maximal 4 Byte angenommen; heißt pro Spalte und Zeile fallen 68 Byte an.
Wenn mir im Speicher 1610612736 Bytes (1,5 GB) zur Verfügung stehen und ich davon ausgehe, dass meine Matrix nach der Virtual Machine (ich arbeite in Java, aber auch in C++ wäre das Problem ähnlich, natürlich mit leichten oder größeren Verschiebungen) vllt. 1,45 GB nutzen kann, stehen mir 1556925644,80 Byte zur Verfügung.
So, das ergibt maximal eine 228.959.653 x 228959653 Matrix (eventueller programmatischer Overhead nicht mit einberechnet).
Das sind Pi mal Daumen max. 228 Millionen Einträge; Abgesehen von einer miesen Performance müßte ich dazu in der Lage sein, deutlich mehr Distanzmaße zu speichern.
Wie würdet ihr das regeln? Gibt es dafür sowas wie best practices?
Danke schonmal vorab und einen schönen Samstag abend!