Bildsequenzen "defragmentiert" kopieren?

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.
shakebox
User
Beiträge: 175
Registriert: Montag 31. März 2008, 17:01

Hi!

Es kommt jetzt ne Frage bei der ich die (verneinende) Antwort schon erwarte/vermute/weiss. Nur will ich nicht aus Faulheit ne Chance auslassen, dass es wider Erwarten doch ne Loesung fuer das Problem gibt. Deshalb stell ich die Frage trotzdem :)

Es geht darum dass ich mit nem Script hochaufgeloeste Einzelbildsequenzen von nem Server auf ein lokales RAID kopieren muss. Das klappt auch wunderbar. Problem ist: da es lauter einzelne Dateien sind werden diese natuerlich irgendwo auf der Zielplatte abgelegt. Damit ein Realtime-Playback dieser Daten aber zuverlaessig und ruckelfrei funktioniert, sollten die Dateien in der richtigen Reihenfolge auf dem RAID liegen.

Normale Defragmentierprogramme koennen ja nicht Zusammenhaenge zwischen Dateien erkennen sondern nur Dateien "in sich" defragmentieren. Es gibt fuer mein Problem zwar ein kommerzielles Produkt, das Einzelbildsequenzen in der Art "defragmentieren" kann. Leider arbeitet das aber nur ueber ne GUI, so dass sich das nicht so einfach in bestehende Workflows und Scripte einbinden laesst.

Deshalb die Frage:
besteht wider Erwarten doch irgendwie ne Chance, beim Kopieren per Pythonscript die Ordnung der Dateien auf dem Zielvolume irgendwie zu beeinflussen? Faellt da irgendjemandem was dazu ein oder sollte ich die Idee aufgrund der Komplexitaet lieber gleich begraben?

Danke und Gruss, Shakebox
rayo
User
Beiträge: 773
Registriert: Mittwoch 5. November 2003, 18:06
Wohnort: Schweiz
Kontaktdaten:

Hi

Arbeitest du mit Windows XP/Vista?

Falls ja:
Windows hat eine deframentierungs API (weiss nicht ab wann), ich hab mit der mal ein wenig gespielt.

Es läuft etwa so ab:
Von der ganzen Festplatte gibt es einen Array der zu jedem Block sagt ob belegt oder frei.

Dann gibts von der Datei eine Liste von Fragmenten, die den virtuellen Block der Datei (beginnt bei jeder Datei bei 0) auf den logischen Block der Platte zuordnet.

z.B. Datei1.txt

Besteht aus 3 Blöcken, virtueller Block 0 startet bei logischem Block 10000 und ist z.B. 100 Blöcke lang
der nächste Block ist der virtuelle Block 100 und startet beim logischen Block 500 und ist au 100 Blöcke lang
usw.

Dann gibt es eine Funktion, bei der du sagen kannst, du möchtest von der Datei1.txt den virtuellen Block 100 mit der Länge 100 zum logischen Block 10100 schieben, da der rest der Datei auch dort ist.

Somit könntest du auch Dateien schön nacheinander auf die Platte legen, falls es einen genug Grossen leeren block auf der Platte hat.

Infos hier:
MSDN zu defragmentieren: http://msdn.microsoft.com/en-us/library ... S.85).aspx
C Beispiel

Zu meinem Code:
Ich hab das ganze via ctypes angesprochen. Muss den Code noch ein wenig überarbeiten bevor ich ihn veröffentlichen möchte, ev schaffe ich das noch diese Woche.

Das ganze ist aber eher langsam weil er aus dem Array der für jeden Block sagt ob die Disk frei ist oder nicht, eine Liste von leeren zusammenhängenden Blöcken erstellt.

Gruss
shakebox
User
Beiträge: 175
Registriert: Montag 31. März 2008, 17:01

ok, danke fuer den Hinweis. Das klingt ja schonmal so als gaebe es zumindest ne Chance. Jetzt muesste man nur noch besser programmieren koennen ;) Das duerfte ne Hausnummer zu hoch sein fuer mich. Aber ja: es geht um ne Windowskiste. Koennte also tatsaechlich klappen. Muss ich mal meine Admins drauf ansetzen.
audax
User
Beiträge: 830
Registriert: Mittwoch 19. Dezember 2007, 10:38

Oder nehmt ne Linux/BSD/sonstwas Kiste, die hat das Problem mit der Fragmentierung erst gar nicht ;)
shakebox
User
Beiträge: 175
Registriert: Montag 31. März 2008, 17:01

inwiefern, lieber audax?

Es geht wie gesagt nicht um die Defragmentierung INNERHALB eines Files sondern darum dass ne Folge von Bildern, also Einzeldateien, auf der Platte hintereinander stehen soll und nicht wild durcheinander.

Ich hab deshalb ja "defragmentiert" auch eben immer in Anfuehrungszeichen geschrieben, weil das ja eigentlich gar keine echte Defragmentierung ist.

Was soll Linux/BSD/... da jetzt anders machen als Windows? Ne Zusammengehoerigkeit von Einzeldateien kann doch auch Linux nicht erkennen, oder?
rayo
User
Beiträge: 773
Registriert: Mittwoch 5. November 2003, 18:06
Wohnort: Schweiz
Kontaktdaten:

Und fragmentiert wird auch auf einer Linux/BSD/sonstwas Kiste, vielleicht nicht so stark wie Windows aber verhindern lässt sich die ganze fragmentierung nur durch umkopieren von Dateien.

Bin gerade dabei meinen Code umzuschreiben, damit könntest du vielleicht was anfangen.

Gruss
shakebox
User
Beiträge: 175
Registriert: Montag 31. März 2008, 17:01

rayo hat geschrieben:Bin gerade dabei meinen Code umzuschreiben, damit könntest du vielleicht was anfangen.
Ui, na da bin ich ja gespannt. Merci vielmals!
Benutzeravatar
cofi
Python-Forum Veteran
Beiträge: 4432
Registriert: Sonntag 30. März 2008, 04:16
Wohnort: RGFybXN0YWR0

rayo hat geschrieben:Und fragmentiert wird auch auf einer Linux/BSD/sonstwas Kiste, vielleicht nicht so stark wie Windows aber verhindern lässt sich die ganze fragmentierung nur durch umkopieren von Dateien.
Naja es kommt vorallem auf das Dateisystem an. Da hat M$ allerdings genügend Böcke geschossen, dass man bei Ext2/3 sagen kann, dass es sowas wie Fragmentierung nich gibt. AFAIK tritt das Problem der Fragmentierung erst bei ner Plattenbelegung von >70% auf, natürlich neben der internen Fragmentierung, dass ne Datei nen Block nicht ganz ausfüllt und so Platz verschwendet wird.
Aber ist schon ne weile her, dass ich mich drüber informiert hab -> meine Hand würd ich dafür nicht ins Feuer legen :roll:
BlackJack

Unter Linux könnte man auch eine unformatierte Partition nehmen und sich mit `libfuse` ein eigenes Dateisystem basteln, dass den Anforderungen genügt.

Ansonsten gibt's für das XFS-Dateisystem Möglichkeiten im laufenden Betrieb zu defragmentieren und Streamingeigenschaften zu garantieren. Da weiss ich aber nicht in wie weit man das auf Einzeldateien festnageln kann.

Notfalls könnte man sich auch eine Containerdatei mit einem "dummen" Dateisystem anlegen und die Einzeldateien dort hinein kopieren.
audax
User
Beiträge: 830
Registriert: Mittwoch 19. Dezember 2007, 10:38

An XFS habe ich nämlich auch gedacht, das kann sowas nämlich. Mal abgesehen davon, das Performance von XFS auch so schon reichen würde ;)

Ich würd mir das mit nem Linux-Rechner dafür ernsthaft überlegen, eventuelle Windows-only Software läuft vielleicht auch ganz gut über Wine.

Das ist hier nicht als Missionierungspost gedacht ;)
Leonidas
Python-Forum Veteran
Beiträge: 16025
Registriert: Freitag 20. Juni 2003, 16:30
Kontaktdaten:

BlackJack hat geschrieben:Ansonsten gibt's für das XFS-Dateisystem Möglichkeiten im laufenden Betrieb zu defragmentieren und Streamingeigenschaften zu garantieren. Da weiss ich aber nicht in wie weit man das auf Einzeldateien festnageln kann.
ext4 wird/unterstützt auch Online-Defragmentierung, aber ich muss sagen, dass ich es bisher nicht getestet habe.
My god, it's full of CARs! | Leonidasvoice vs (former) Modvoice
BlackJack

XSF bietet aber wohl ziemlich weitreichende Möglichkeiten die Verteilung der Daten zu beeinflussen um Garantien für festgelegte, durchgehende Datenraten zu geben.
audax
User
Beiträge: 830
Registriert: Mittwoch 19. Dezember 2007, 10:38

Es ist eben durch und durch für fette Datenblobs und auf Schnelligkeit optimiert..das merkt man schon ;)
rayo
User
Beiträge: 773
Registriert: Mittwoch 5. November 2003, 18:06
Wohnort: Schweiz
Kontaktdaten:

Hi

Also ich habs mal ein wenig umgeschrieben und jetzt werden alle Dateien in einem Ordner alphabetisch sortiert auf der Festplatte abgelegt.

Aber als Warnung! Ich hab es nicht ausführlich getestet, bei mir hat er einfach 20 jpeg Dateien sortiert. Kann dir keine Garantie geben dass nacher nicht irgendwie das Filesystem defekt ist oder so. Ausprobieren auf eigene Verantwortung.

Ausprobiert wurde es auf Windows Vista auf einer externen Platte (keine RAID Platte, weiss nicht ob es da nicht funktioniert)

Einfach mit "defrag.py <pfad>" starten

defrag_api.py
errors.py
defrag.py

Bei grossen Platten empfehle ich dir noch psyco zu installieren, das Script verwendet es automatisch falls es vorhanden ist.

Gruss
shakebox
User
Beiträge: 175
Registriert: Montag 31. März 2008, 17:01

wow, werde ich mir anschauen. Danke vielmals. Hat sich also doch gelohnt dass ich mir diese eigentlich aussichtslose Frage nicht verkniffen habe. Man sollte halt einfach nix unversucht lassen.
shakebox
User
Beiträge: 175
Registriert: Montag 31. März 2008, 17:01

kleine Frage noch zum Verstaendnis:
da Du jetzt nur einen Pfad als Parameter hast, gehe ich richtig in der Annahme dass das jetzt nicht kopiert sondern einen Ordner mit Dateien, der sich schon auf dem Zielvolume befindet, in eine richtige Reihenfolge bringt!?
rayo
User
Beiträge: 773
Registriert: Mittwoch 5. November 2003, 18:06
Wohnort: Schweiz
Kontaktdaten:

Genau, der Ordner bleibt im Explorer genau gleich, nur die Dateien sind auf der HD neu sortiert.

Braucht aber eine defragmentierte HD da er nur prüft ob es einen genügen grossen Block frei hat.

Gruss
shakebox
User
Beiträge: 175
Registriert: Montag 31. März 2008, 17:01

so, ersten Test gemacht, leider laeuft der nicht durch. Er geht bis zu den Zeilen

Code: Alles auswählen

cmap = ClusterMap(vmap, cluster_count)
blocks = BlockMap(cmap)
die erste Zeile schafft er noch, aber beim Aufruf der zweiten Zeile steigt er mir dann mit folgender Meldung aus:
Traceback (most recent call last):
File "C:\Dokumente und Einstellungen\Administrator\Desktop\defrag\defrag.py", line 213, in <module>
main()
File "C:\Dokumente und Einstellungen\Administrator\Desktop\defrag\defrag.py", line 190, in main
blocks = BlockMap(cmap)
File "C:\Dokumente und Einstellungen\Administrator\Desktop\defrag\defrag.py", line 45, in __init__
list.__init__()
TypeError: descriptor '__init__' of 'list' object needs an argument
Ne Idee, was das sein koennte? Stimmt da was bei mir in meiner Pythonconfig nicht, oder ist da wirklich im Code noch was faul? Danke!
shakebox
User
Beiträge: 175
Registriert: Montag 31. März 2008, 17:01

ok, ich hab mich jetzt mal getraut, die Zeile

Code: Alles auswählen

list.__init__()
umzuaendern in

Code: Alles auswählen

list.__init__(self)
und prompt funktioniert das Ganze. Hoffe ich mach damit nicht irgendwas absolut falsch/kaputt!?

Damit laeuft es auch wunderbar durch und die Sequenzen sind tatsaechlich defragmentiert. Ich bin hellauf begeistert und verbluefft! Nun muss ich das nur noch mit meinem RAID testen und dann in meinen Workflow einbauen.

Danke, danke, danke, danke, danke, danke!!!!
shakebox
User
Beiträge: 175
Registriert: Montag 31. März 2008, 17:01

klar, waere ja auch zu schoen gewesen, wenn das auf dem RAID genauso funktioniert haette :) Denke da ist das nicht so einfach. Auf jeden Fall bekomme ich da folgende Meldung:
Traceback (most recent call last):
File "C:\Dokumente und Einstellungen\Administrator\Desktop\defrag\defrag.py", line 211, in <module>
main()
File "C:\Dokumente und Einstellungen\Administrator\Desktop\defrag\defrag.py", line 186, in main
cluster_size = get_cluster_size(volume)
File "C:\Dokumente und Einstellungen\Administrator\Desktop\defrag\defrag.py", line 153, in get_cluster_size
return get_disk_size(volume)/defrag.get_volume_map(volume)[1]
File "C:\Dokumente und Einstellungen\Administrator\Desktop\defrag\defrag_api.py", line 186, in get_volume_map
raise VolumeMapException(error, errors[get_last_error()])
defrag_api.VolumeMapException: (6L, 'ERROR_INVALID_HANDLE')
Antworten