| Autor |
Nachricht |
Die erinnerung
Mitglied
Benutzerprofil
Anmeldungsdatum: 20.10.2010
Beiträge: 337
|
Die erinnerung Mitglied
15:12:23 10.04.2012 Titel: |
Programm hängt sich in einer For-Schleife beim Erzeugen von Objekten auf. |
Zitieren |
Hallo.
Ich weiß, der Titel hört sich komisch an, aber das ist das Problem.
Ich erzeugen in einer For-Schleife Objekte, die ich in einer unordered_map speichere.
Bei genau 32.768 bleibt das Programm einige Sekunden stehen und bei 262.144 bleibt es vollständig hängen!
Mein Code: (Auf mehre Datein verteilt!)
main.cpp:
| C++: | 1 2 3 4 5 6 7 8 | //Codeauschnitt: (wird aber ausgefürht!)
World welt;
for(int i = 0; i < 16777000; i++)
{
welt.add((Bit25) i); //"Bit25" ist "std::bitset<25>"
}
//Ende | |
World.cpp:
| C++: | 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 | //Codeauschnitt: (das ist die Funktion, die aufgerufen wird)
void World::add(Bit25 pos)
{
WorldIter it = Welt.find(pos); //"WorldIter" ist "std::tr1::unordered_map<Bit25, Block_Container*>::iterator"
if(it == Welt.end())
{
World::Welt[pos] = new Block_Container(pos, (Bit20) 0, *this);
//"Bit20" ist "std::bitmap<20>"
//World::Welt ist vom Datentyp "std::tr1::unordered_map<Bit25, Block_Container*>"
}
else
{
throw(BF_Error(2)); //Fehlerfall (wird hier nicht aufgerufen!)
}
}
//Ende | |
Block_Container.cpp:
| C++: | 1 2 3 4 5 6 7 8 9 10 | //Codeauschnitt: (das ist der Konstruktor, der aufgerufen wird)
Block_Container::Block_Container(Bit25 pos, Bit20 data, World &welt)
{
Block_Container::pos = pos; //Datentyp "Bit25"
Block_Container::data = data; //Datentyp "Bit20"
Block_Container::world = &welt; //Datentyp "World*"
}
//Ende | |
Ich verstehe nicht, warum das Programm nicht weiterspeichert.
Bei Bedarf an mehr Code, einfach schreiben!
Ich muss korrigieren! Ein Freund sagte, dass das Programm nach 20 min weiter macht und dann zwischen 2.097.000 und 2.097.999 anhält. Ich vermute, jetzt müsste man noch länger warten und dann kommt nochmal viel weiter! |
_________________ Ich bin icht perfekt!
Aber meistens!
Zuletzt bearbeitet von Die erinnerung am 15:27:13 10.04.2012, insgesamt 2-mal bearbeitet |
|
 |
knivil
Mitglied
Benutzerprofil
Anmeldungsdatum: 11.02.2009
Beiträge: 5874
|
knivil Mitglied
15:23:44 10.04.2012 Titel: |
|
Zitieren |
Was ist das: .. (Bit25) i .. Du castest einen Int nach einen zusammengesetzten typ? Oder std::bitmap, ich habe bis jetzt nur mit std::bitset gearbeitet. |
_________________ If it were not for laughter, there would be no Tao.
Sie können einen Beitrag nicht so schnell nach Ihrem letzten absenden, bitte warten Sie einen Augenblick.
|
|
 |
Die erinnerung
Mitglied
Benutzerprofil
Anmeldungsdatum: 20.10.2010
Beiträge: 337
|
Die erinnerung Mitglied
15:26:49 10.04.2012 Titel: |
|
Zitieren |
Mein Fehler!!!!! Es ist nicht bitmap, sondern bitset!!!
Ich korrigiere den Code |
_________________ Ich bin icht perfekt!
Aber meistens!
Zuletzt bearbeitet von Die erinnerung am 15:28:16 10.04.2012, insgesamt 1-mal bearbeitet |
|
 |
Die erinnerung
Mitglied
Benutzerprofil
Anmeldungsdatum: 20.10.2010
Beiträge: 337
|
Die erinnerung Mitglied
14:19:59 11.04.2012 Titel: |
|
Zitieren |
Wäre ein Möglichkeit, dass ich im Prinzip mehre unordered_maps anlege und die dann über eine Zentrale Klasse verwalte? |
_________________ Ich bin icht perfekt!
Aber meistens!
|
|
 |
cooky451
Mitglied
Benutzerprofil
Anmeldungsdatum: 16.10.2010
Beiträge: 6875
|
cooky451 Mitglied
14:26:49 11.04.2012 Titel: |
|
Zitieren |
Warum forderst du den BlockContainer mit new an? Scheint mir nicht so sinnvoll. Und wenn du mit .insert() arbeitest, kannst du am Rückgabewert feststellen ob überschrieben wurde oder nicht, das dürfte performanter sein. Und was dieser Cast von int nach bitset soll hast du auch noch nicht beantwortet. |
_________________ Sie sind nicht berechtigt unrechtmäßige Kopien dieses Datenträgers zu erstellen.™
Keksverteilungsbeauftragter
|
|
 |
ScottZhang
Mitglied
Benutzerprofil
Anmeldungsdatum: 17.12.2010
Beiträge: 517
|
ScottZhang Mitglied
14:39:30 11.04.2012 Titel: |
|
Zitieren |
Vllt einfach ma abschätzen wieviel Speicher du da brauchst. vermutlich wird einfach nur heftig geswapt ? |
_________________ If anything has been made foolproof, a better fool will be developed.
Hobby
|
|
 |
Die erinnerung
Mitglied
Benutzerprofil
Anmeldungsdatum: 20.10.2010
Beiträge: 337
|
Die erinnerung Mitglied
14:50:02 11.04.2012 Titel: |
|
Zitieren |
Ich mache das mit new, weil die map als Datentyp Block_Container* nimmt. Und das mit dem casten:
ganz einfach! Mein Key ist aus Speicherplatzgründen ein bitset und da ich bitsets nicht inkremetiren kann, caste ich einfach! |
_________________ Ich bin icht perfekt!
Aber meistens!
|
|
 |
cooky451
Mitglied
Benutzerprofil
Anmeldungsdatum: 16.10.2010
Beiträge: 6875
|
cooky451 Mitglied
15:02:25 11.04.2012 Titel: |
|
Zitieren |
| Die erinnerung schrieb: | | Ich mache das mit new, weil die map als Datentyp Block_Container* nimmt. | Haha LOL, ja, super Begründung. Und warum machst du die map nicht zu einer unordered_map<Bit25, Block_Container>?
| Die erinnerung schrieb: | | ganz einfach! Mein Key ist aus Speicherplatzgründen ein bitset und da ich bitsets nicht inkremetiren kann, caste ich einfach! | bitset hat nicht umsonst to_ulong und Konstruktoren. Arbeite damit. |
_________________ Sie sind nicht berechtigt unrechtmäßige Kopien dieses Datenträgers zu erstellen.™
Keksverteilungsbeauftragter
|
|
 |
RedPuma
Mitglied
Benutzerprofil
Anmeldungsdatum: 24.01.2008
Beiträge: 165
|
RedPuma Mitglied
15:03:56 11.04.2012 Titel: |
|
Zitieren |
Kann es sein dass du irgendwo einen relativ aufwändigen Copy-Constructor hast welcher aufgerufen wird wenn der von der map reservierte Speicherplatz nicht mehr ausreicht und re-allokiert werden muss? Diese re-allokation ist der einzige Grund der mir einfällt damit die Ausführung bei bestimmten Grenzen auf einmal scheinbar anhält.
Noch eine Anmerkung: Ein Bitset mit 25 Elementen benötigt 4 Byte, da kannst du also genausogut einen unsigned int verwenden. Ein Computer kann nunmal nur Byteweise adressieren. Ein Bitset mit 20 Elementen benötigt 3 Byte, ich vermute aber mal das dein new Operator auf ein Alignment von 4 Byte eingestellt ist was deine Bitset-Speicherspaar-Idee komplett zunichte macht.
Und noch eine Anmerkung: warum benutzt du unordered_map? Wegen dem (ohnehin sinnlosen) Bitset eine Map zu benutzen ist die reinste Verschwendung. Erstell per new[] den ganzen Batzen an Blöcken, weise ihnen hinterher in ner Schleife ihre Position zu und benutz zur Adressierung der Blöcke einfache unsigned int. Das ist schätzungsweise 1000 mal schneller und benötigt im Endeffekt den selben Speicherplatz. Wenn du bei STL Typen bleiben willst dann benutze std::vector<Block_Container> Welt(16777000). |
_________________ “Manually managing blocks of memory in C is like juggling bars of soap in a prison shower: It’s all fun and games until you forget about one of them.”
– anonymous Usenet user
Zuletzt bearbeitet von RedPuma am 15:33:59 11.04.2012, insgesamt 3-mal bearbeitet |
|
 |
Die erinnerung
Mitglied
Benutzerprofil
Anmeldungsdatum: 20.10.2010
Beiträge: 337
|
Die erinnerung Mitglied
18:39:36 11.04.2012 Titel: |
|
Zitieren |
Einen solchen Konstruktor habe ich nicht (oder besser gesagt: nicht das ich wüsste). Aber wenn du das ansprichst: Kann man einer (unordered_)map im Vor-raus eine Größe zuweisen?
Der Grund warum ich eine (unordered_)map verwnde ist ganz einfach.
Ich möchte nicht jede Zahl von 0 bis ca. 16.777.000 belegen. Es sind lücken enthalten. Und der bitset als Key gibt die Position an! |
_________________ Ich bin icht perfekt!
Aber meistens!
Zuletzt bearbeitet von Die erinnerung am 19:23:55 11.04.2012, insgesamt 1-mal bearbeitet |
|
 |