Zugriffszeiten auf arays "unendlich" groß. Was tun?
-
Das folgende, vereinfachte Programm arbeitet bei mir superschnell:
float f_;
for(m1=0;m1<(max1);m1++)
for(m2=0;m2<(max2);m2++)
f_=4;Wenn ich aber auf ein Aray zugreife, dauert es Stunden oder Tage !!!
float f_aray[GANZGROSS];
for(m1=0;m1<(max1);m1++)
for(m2=0;m2<(max2);m2++)
f_aray[0]=4;Ich gebe allerdings zu, daß das Problem nur bei extrem großen Datenmengen (die ich aber leider zu bearbeiten habe) so unzumutbar stark in's Gewicht fällt.
Da ich aber nicht den Rechner mehrere Wochen laufen lassen kann und möglichst schon heute Resultate brauche, hier meine Frage nach alternativen.
(Wie gesagt GANZGROSS und max1 und max2 sind mehrer MByte groß)static float f_aray[GANZGROSS]; nützt übrigens auch nichts und double f_aray[GANZGROSS]; natürlich schon gar nicht.
Bin dankbar für jeden Tip / jede Versuchsmöglichkeit.
-
Wenn du wirklich jedes Element deines Arrays auslesen/verarbeiten mußt, wirst du da nicht viel beschleunigen können. Aber einige Millionen mal den selben Wert auf 4 zu setzen erscheint mir jetzt reichlich sinnlos.
-
Natürlich ist das wirkliche Programm schon etwas komplexer.
Mir geht es in dem Beispiel nur um die nachcompilierbare Grundsätzlichkeit der Problematik.Wenn ich auf einen Integer in millionenfach schnellerer Zeit zugreifen kann (oder optimiert der Compiler da heimlich und setzt f_ nur einmal auf 4?), begreife ich den Grund für den extrem langsamen Arrayzugriff einfach nicht.
Weiß ja nicht wie Windows/die MFC die Adressierung von Arrays registerintern regelt, aber so kann man ja mit einem Computer bei größeren Datenmengen (und ich halte sie schon alle im Hauptspeicher) überhaupt nichts rechnen...

-
Wenn du immer den selben Wert überschreibst, kann es durchaus sein, daß der Compiler die betroffene Variable in ein Register packt (dann wird's schneller) - oder eventuell sogar intelligent genug ist, die Schleife komplett zu überspringen.
Aber du solltest dir mal überlegen, ob du wirklich alle Array-Elemente einzeln einlesen mußt - vielleicht kannst du ja an dem zugrundeliegenden Algorithmus etwas ändern, um den Ablauf zu verbessern (Randfrage: Was genau machst du mit diesem riesigen Array?). Wenn das nicht geht, mußt du wohl in den sauren Apfel beißen - und warten.
-
ich wuerde vorschlagen die daten in einen std:: container zu packen, und dann mit den for_each oder aehnlichen algorithmen zu arbeiten, koennte evtl was bringen, bin da aber nicht sicher
-
CStoll schrieb:
Was genau machst du mit diesem riesigen Array?
Es sind in Wirklichkeit 4 Arrays (Excel-Eingabedateien), die nach bestimmten Kriterien zu einem fünften zusammengefaßt werden müssen und in eine fünfte Datei ausgegeben werden. Zu komplex, das hier alles hereinzustellen.
Hatte gehofft, mir das Nachdenken über einen intelligenteren Algorithmis sparen zu können...
(wenn es überhaupt einen gibt, da ich ja jedes Element aller Arrays, die in Wirklichkeit sogar 4 Structs mit verschiedenen Datentypen sind, einzeln betrachten und analysieren muß...)Muß jetzt aber weg und werde den Rechner mal über Nacht oder über's Wochenede rechnen lassen...
-
bei solch einer komplexitaet wuerde ich schon auf die standardbibliothek hoffen, da gibt es einige algos die du nutzen kannst, evtl sind auch welche aus boost interessant
eigene sortings, find nte element of und weiss der geier, geht auch in strukturen problemlos