Script frisst 1,3 GB Ram? Memory Leak?

Wenn du dir nicht sicher bist, in welchem der anderen Foren du die Frage stellen sollst, dann bist du hier im Forum für allgemeine Fragen sicher richtig.
Antworten
AngelusNoctis
User
Beiträge: 92
Registriert: Sonntag 16. Dezember 2007, 20:03

Hi

Ich hab ein kleines Problem mit nem sehr einfachen Script das ne Platte mit Binärwerten überschreibt.

Zwar ist das Problem dass das Script über 1,3 GB Ram frisst laut top (16% des RAM) und free.

Im normal zustand benötigt meine Kiste ca 700MB sobald ich das Script starte bin ich bei 2 GB.


Kann mir jemand erklären wieso dieses Script das auslöst?

Code: Alles auswählen

import parted

gutman_binary = ['U\x00\x00\x00' , '\xaa\x00\x00\x00', '$I\x92\x00', '\x92$I\x00', 'I\x92$\x00', '\x00\x00\x00\x00', '\x11\x00\x00\x00', '"\x00\x00\x00', '3\x00\x00\x00', 'D\x00\x00\x00', 'U\x00\x00\x00', 'f\x00\x00\x00', 'w\x00\x00\x00', '\x88\x00\x00\x00', '\x99\x00\x00\x00', '\xaa\x00\x00\x00', '\xbb\x00\x00\x00', '\xcc\x00\x00\x00', '\xdd\x00\x00\x00', '\xee\x00\x00\x00', '\xff\x00\x00\x00', '$I\x92\x00', '\x92$I\x00', 'I\x92$\x00', '\xdb\xb6m\x00', 'm\xdb\xb6\x00', '\xb6m\xdb\x00']

size = int(parted.getDevice('/dev/sda3').getSize('KB'))

f = open('/dev/sda3' , 'wb')

for method in gutman_binary:
    data = method * 256
    for i in range(size):
        f.write(data)
    f.seek(0)
f.close()
    
    

Ach ja, es ist egal ob nun die "gutman_binary" Liste nun ein Element hat oder data = method *256 ausserhalb der Schleifen ist.

Bild
Zuletzt geändert von AngelusNoctis am Freitag 19. November 2010, 10:00, insgesamt 1-mal geändert.
Benutzeravatar
bwbg
User
Beiträge: 407
Registriert: Mittwoch 23. Januar 2008, 13:35

range(n) liefert eine Liste mit den Elementen von 0 bis n-1. Bei einer Partitionsgröße von 25GB wären das schon rund 25 x 1000 x 1000 x 4B = 100MB (In der Annahme das eine Int genau 4 Byte benötigt). Das ganze noch multipliziert mit len(gutman_binary) Worst Case.

Verwende xrange, wenn du nicht explizit eine Liste benötigst. xrange gibt einen Generator zurück, welcher die gewünschten Werte erzeugt.

Mit Python3 sieht das wieder anders aus.

Grüße...
bwbg

Edit: Typo.
"Du bist der Messias! Und ich muss es wissen, denn ich bin schon einigen gefolgt!"
BlackJack

@AngelusNoctis: Falls Du keine Platten aus Mitte der 90er oder früher löschen möchtest (dann hättest Du das Speicherproblem hier wahrscheinlich nicht :-)), dann reicht auch *einmal* überschreiben mit Nullen, oder wenn Du ganz paranoid bist, mit Zufallsdaten. Siehe auch Gutmans Epiloge zu dem Paper aus dem die Datenmuster stammen.
AngelusNoctis
User
Beiträge: 92
Registriert: Sonntag 16. Dezember 2007, 20:03

@bwbg

Perfekt :)

Gleicher Code mit xrange anstelle von range und schon sinds nur 0.1 - 0.5 MB.


Danke :)

@BlackJack

Ist mir klar, hab aber ollständigkeits halber folgende Methoden in mein PyQt Programm gehauen:

Zero
DoD 5220.22-M E
DoD 5220.22-M ECE
VSITR
Gutman
Benutzeravatar
mkesper
User
Beiträge: 919
Registriert: Montag 20. November 2006, 15:48
Wohnort: formerly known as mkallas
Kontaktdaten:

AngelusNoctis hat geschrieben: @BlackJack

Ist mir klar, hab aber ollständigkeits halber folgende Methoden in mein PyQt Programm gehauen:
Weg damit, sowas unterstützt nur Leute, die an UFOs glauben etc. Wieso mehrere Methoden zur Auswahl anbieten, wenn die keinen Sinn ergeben?
BlackJack

Oder Alternativ auch mehr Auswahl anbieten, denn "Gutman" ist ja nicht *eine* Methode sonder verschiedene Muster für verschiedene Plattenarten beziehungsweise Aufzeichnungsformate. Damit jemand der eine Platte aus den 80ern löschen möchte, auch tatsächlich die *dazu* passende Methode auswählen kann. :-D
Antworten