Was ist effizienter: Hash von Arrays oder Array von Arrays?

11/01/2010 - 09:53 von Maximilian Hirner | Report spam
Hallo!

Auf dieses Problem bin ich neulich gekommen, nachdem mein Computer
(àlterer Athlon, 1 GHz CPU) bei der Ausführung das Programm getötet hat,
obwohl ich den Code schon an verschiedenen Stellen effizienter gemacht
habe.

Vereinfacht tut mein Skript folgendes:

Ich habe Daten dieser Form vorliegen:
Name Kategorie Wert 1 ... Wert 25
Name 1 1 ...
Name 2 2 ...
Name 1 2 ...
...

Jeder Name kann also mehrfach vorkommen.
Jede Kombination von Name und Kategorie kann theoretisch vorkommen.
Ziel des Ganzen ist es, für jede Kombination Name-Kategorie, für alle
25 Werte die einzelnen Eintràge aufzusummieren. (Die meisten Eintràge
sind gleich 0, aber eben nur die meisten.) Anschließend will ich das
Ganze noch ausdrucken, aber so weit bin ich noch nicht.

Insgesamt gibt es über 20000 verschiedene Namen in meinen Daten. Die
Kategorie kann einen von 15 Werten annehmen. Ursprünglich wollte ich
das Ganze in eine 3-dimensionale Matrix anordnen (ergibt 20000 mal 15
mal 25 Werte). Im Moment funktioniert das Skript so, dass ich 25 Hashes
habe; in den Hashes verweist der Name jeweils auf einen Array mit 15
Werten. Aber wie gesagt, für meinen Computer ist das anscheinend zuviel.
(20k * 15 * 25 = 7,5M. Ist das wirklich zuviel?)

Ich hatte schon die Idee, jedem Namen einen Index zuzuweisen. Dann
könnte ich die Hashes durch Arrays ersetzen. Aber würde das Programm
dann auch tatsàchlich besser laufen? Kann mir das jemand sagen, bevor
ich das Programm für nichts umschreibe?

CU und TIA, Max
 

Lesen sie die antworten

#1 Frank Seitz
11/01/2010 - 11:01 | Warnen spam
Maximilian Hirner wrote:
Hallo!

Auf dieses Problem bin ich neulich gekommen, nachdem mein Computer
(àlterer Athlon, 1 GHz CPU) bei der Ausführung das Programm getötet hat,
obwohl ich den Code schon an verschiedenen Stellen effizienter gemacht
habe.

Vereinfacht tut mein Skript folgendes:

Ich habe Daten dieser Form vorliegen:
Name Kategorie Wert 1 ... Wert 25
Name 1 1 ...
Name 2 2 ...
Name 1 2 ...
...

Jeder Name kann also mehrfach vorkommen.
Jede Kombination von Name und Kategorie kann theoretisch vorkommen.
Ziel des Ganzen ist es, für jede Kombination Name-Kategorie, für alle
25 Werte die einzelnen Eintràge aufzusummieren. (Die meisten Eintràge
sind gleich 0, aber eben nur die meisten.) Anschließend will ich das
Ganze noch ausdrucken, aber so weit bin ich noch nicht.

Insgesamt gibt es über 20000 verschiedene Namen in meinen Daten. Die
Kategorie kann einen von 15 Werten annehmen. Ursprünglich wollte ich
das Ganze in eine 3-dimensionale Matrix anordnen (ergibt 20000 mal 15
mal 25 Werte). Im Moment funktioniert das Skript so, dass ich 25 Hashes
habe; in den Hashes verweist der Name jeweils auf einen Array mit 15
Werten. Aber wie gesagt, für meinen Computer ist das anscheinend zuviel.
(20k * 15 * 25 = 7,5M. Ist das wirklich zuviel?)

Ich hatte schon die Idee, jedem Namen einen Index zuzuweisen. Dann
könnte ich die Hashes durch Arrays ersetzen. Aber würde das Programm
dann auch tatsàchlich besser laufen? Kann mir das jemand sagen, bevor
ich das Programm für nichts umschreibe?



Ich verstehe deine Datenstruktur nicht so richtig. Ich würde
vermutlich einen Hash of Hash of Hashes bilden und nur die
Werte abspeichern, die nicht 0 sind.

Dein Denkfehler ist, dass du davon ausgehst, dass
eine Datenstruktur keinen Platz benötigt. Tatsàchlich benötigt
Perl (5.10) schon zum Speichern eines einzigen Integer-Werts 16 Bytes.
Ein 15 Elemente großes Array belegt - ohne Daten! - 160 Bytes usw.

Grüße
Frank
Dipl.-Inform. Frank Seitz
Anwendungen für Ihr Internet und Intranet
Tel: 04103/180301; Fax: -02; Industriestr. 31, 22880 Wedel

Homepage: http://www.frank-seitz.de/
XING-Profil: http://www.xing.com/profile/Frank_Seitz2

Ähnliche fragen