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
Bildsequenzen "defragmentiert" kopieren?
-
- 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
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
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.
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?
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?
-
- 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
Bin gerade dabei meinen Code umzuschreiben, damit könntest du vielleicht was anfangen.
Gruss
- cofi
- Python-Forum Veteran
- Beiträge: 4432
- Registriert: Sonntag 30. März 2008, 04:16
- Wohnort: RGFybXN0YWR0
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.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.
Aber ist schon ne weile her, dass ich mich drüber informiert hab -> meine Hand würd ich dafür nicht ins Feuer legen
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.
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.
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
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
-
- Python-Forum Veteran
- Beiträge: 16025
- Registriert: Freitag 20. Juni 2003, 16:30
- Kontaktdaten:
ext4 wird/unterstützt auch Online-Defragmentierung, aber ich muss sagen, dass ich es bisher nicht getestet habe.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.
My god, it's full of CARs! | Leonidasvoice vs (former) Modvoice
XSF bietet aber wohl ziemlich weitreichende Möglichkeiten die Verteilung der Daten zu beeinflussen um Garantien für festgelegte, durchgehende Datenraten zu geben.
-
- 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
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
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!?
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!?
-
- 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
Braucht aber eine defragmentierte HD da er nur prüft ob es einen genügen grossen Block frei hat.
Gruss
so, ersten Test gemacht, leider laeuft der nicht durch. Er geht bis zu den Zeilen
die erste Zeile schafft er noch, aber beim Aufruf der zweiten Zeile steigt er mir dann mit folgender Meldung aus:
Code: Alles auswählen
cmap = ClusterMap(vmap, cluster_count)
blocks = BlockMap(cmap)
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!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
ok, ich hab mich jetzt mal getraut, die Zeile
umzuaendern in
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!!!!
Code: Alles auswählen
list.__init__()
Code: Alles auswählen
list.__init__(self)
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!!!!
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')