PDA

Archiv verlassen und diese Seite im Standarddesign anzeigen : Python, Integer und Array



jahlives
07-01-2005, 13:20
Salut zusammen

ich bastle immer noch an meinem Primzahlen Script (momentan versuche ich alle Composite Zahlen aus einem bereits erstellten Array zu putzen).
Nun habe ich immer die 2 gleichen Probs:
1.Bis zu einem Index von ca. 675'000 funzt es auch prächtig, doch dann verabschiedet sich Python mit der Meldung dass sich der nächste Index nicht mehr in einem Integer darstellen lässt. Kann man Python dazu überreden für den Index einen long zu verwenden ?
2. Obwohl ich die Auslagerungsdatei auf 4 GB geschraubt habe (das ergibt zusammen mit dem RAM gut 4.5 GB Speicher) stürzt Python immer bei einer Grösse von 1.2 GB bei der Auslagerungsdatei mit einem Mem Error ab. Dies obwohl gemäss Taskmanager noch genügend GB vorhanden sein müssten.
Kann man in Python irgendwo dran drehen, dass er mehr von der Auslagerungsdatei gebraucht ?

RapidMax
09-01-2005, 03:00
Kann man in Python irgendwo dran drehen, dass er mehr von der Auslagerungsdatei gebraucht ?
Das wird vom Betriebsystem geregelt.
Was für ein Algorithmus verwendest du? Das Sieb des Eratosthenes (http://de.wikipedia.org/wiki/Sieb_des_Eratosthenes)?

jahlives
15-01-2005, 07:55
Salut RapidMax

bin in den Ferien drum hat's etwas gedauert :cool:
Ich verwende das Sieb und wollte das ganze mit nem Array machen. Ich versuche zuerst dass Array aufzubauen mit allen Zahlen (die Werte der Zahlen entsprechen dem Index des Array's).Der Inhalt eines Elements initialisiere ich mit 1. Danach habe ich bei jeder Composite Zahl den Wert 0 geschrieben und am Ende frage ich einfach ab vieviele Elemente mit dem Wert 1 es gibt --> Primzahl.

Das mit der Aulagerungsdatei habe ich mittlerweile hingekriegt (ein Neustart reichte komischerweise nicht aus, sonder ich musste die Kiste komplett abschalten, ehe die veraenderte Groesse der Auslagerungsdatei uebernommen wurde).

Das Problem ist immer dass mir bei einem Index groesser als 650'000 und ein paar Zerquetschte, Python mit einem Fehler abstuerzt: Zahl zu gross um in einen Integer konvertiert zu werden.

Sobald ich wieder zu Hause bin werde ich mich wieder ueber den Code hermachen.

Cheers

tobi

michael.sprick
15-01-2005, 08:54
So große Arrays sind eine ganz schlechte Idee...

Damit ein Array funktioniert, müssen seine Elemente lückenlos im Speicher hintereinander liegen. Es spielt keine Rolle wieviel Speicher insgesamt noch frei ist - die Frage ist eher, wie groß der größte freie zusammenhängende Speicherbereich ist.
Das Problem tritt also immer zur Laufzeit auf. Mal wirds gehen, mal nicht...
Um den Speicher optimal zu nutzen und noch ein wenig Geschwindigkeit draufzulegen (und Dein Index Problem abzuschaffen) solltest Du Dir evtl. überlegen ob Du nicht lieber eine Verkettung machen willst...

Dazu erstellst Du Dir einfach eine Klasse mit zwei Attributen:
1) Dein Wert, der sonst im Array stehen würde
2) ein Zeiger auf ein nachfolgendes Objekt dieser Klasse

Jedes Element kennt dann einen Nachfolger bzw. bildet irgendwann das Schlussglied. Dann kannst Du Dich "durchhangeln" und brauchst keinen Index mehr.

hth, Michael

fs111
15-01-2005, 11:24
Könnte man das nicht auch mit Iteratoren lösen? (Stichwort yield)

fs111