HI zusammen,
hab nochmal ein Problem bei dem ich keinen Ansatz finde.
Ich schreibe ständig Dateien auf 2 Festplatten 24/7 und nutze eine simple Ringspeicherfunktionalität dadurch das ich älteste Dateien lösche..
Nun habe ich aber natürlich recht zügig das Problem das die Platten sehr schnell eine Fragmentierung von 99% aufweisen und alles sehr langsam wird.
Hat jemand von euch eine Idee wie ich das Thema am besten angehen könnte ? Die beste Variante wäre wahrscheinlich wenn ich einzelne Dateien unfragmentiert ablegen könnte.
Hallo inek,
mit den normalen Dateizugriffen (Schreiboperationen) kannst du nicht steuern, welche Sektoren für die Dateien verwendet werden.
Wenn du eine SSD im System hast, könntest du die Dateien darauf speichern. Eine SSD fragmentiert auch, aber das hat viel geringere, meistens nichts spürbare Auswirkungen.
Wenn du weißt, wie die große die Dateien (maximal) werden, kannst du diese Größe beim Öffnen der Dateien angeben. Das Dateisystem kann sich dann einen möglichst günstigen (zusammenhängenden) Platz für eine Datei dieser Größe suchen/reservieren.
herbivore
Für mich sieht es so aus als würdest hier ein logisches Problem einfach an das BS weiterleiten wollen. Ich werde jetzt aber nicht weiter spekulieren. Ich könnte mal raten das du mit File.Copy und Co. arbeitest, statt mit FileStream. Dann wirst du in einem Heavy-Data Scenario sicher bald die Grenzen erreichen. Kannst du das Problem genauer beleuchten? (im moment weiss man ja nur, dir ist das Dateisystem zu blöd)
Kannst du irgendwelche Voraussagen über die Größen der Dateien treffen? Wenn die z.B. alle ähnlich groß sind, könntest du die Dateien da lassen und nur als frei markieren, statt sie zu löschen. Dann wär der Speicherbereich bereits reserviert.
Bei einer HDD sollte man mit Streams arbeiten, sodass das Betriebssystem frei über die Fragmentierung entscheiden kann. Meist wird durch die Streams der identische Platz verwendet.
Bei SSDs hat man überhaupt keine Möglichkeit in die Fragmentierung einzugreifen; das lassen die Controller nicht zu.
- performance is a feature -
Microsoft MVP - @Website - @AzureStuttgart - github.com/BenjaminAbt - Sustainable Code
Hi.. Sry das ich mich zu dem Thema nicht mehr gemeldet habe.. Hab das irgendwie aus den Augen verloren. Also ich arbeite an der stelle schon mit streams. Allerdings zeichne ich im Ringspeicher halt videodaten von mehreren kameras auf. Die sind zwar nicht immer gleich groß, aber ich kann ja die maximale größe berechnen da die Videos immer max. 5 Minuten lang sind. Bisher habe ich das Problem mit der fragmentierung nicht zufriedenstellend lösen können.
Da ich bei 24 Kameras so ca. 4TB für 7 Tage aufzeichnung brauche fällt ne ssd raus.
Ich bin für jede Hilfe dankbar.
Naja, in der Menge und mit dem Speicherelement wirst Du kaum Einfluss auf die Fragmentierung nehmen können.
- performance is a feature -
Microsoft MVP - @Website - @AzureStuttgart - github.com/BenjaminAbt - Sustainable Code
Circular Buffer Prinzip pflicht?
- performance is a feature -
Microsoft MVP - @Website - @AzureStuttgart - github.com/BenjaminAbt - Sustainable Code
Bin grad etwas verwirrt durch die Begrifflichkeiten ....
simple Ringspeicherfunktionalität
meinst du wirklich nen Ringbuffer, oder meinst du ne File Rotation, wie es bei logfiles z.b. recht üblich ist ?
Das eine hat wenig mit dem anderen zu tun ^^
Falls es nur um eine File Rotation geht, kannst von aussen nicht viel machen.
Ausser:
Wenn es um Logfile ähnliche daten geht, bieten die OSse vielleicht paar intressante Ansätze, die auf Punkt 2 und Punkt 3 schon optimieren ...
Windows - SystemLogDienst
Linux - journald
In deinem "Video" härtefall würd ich versuchen, übers Netz speichern, für den Share nen OS mit etwas "spezialisierteren" Dateisystem für deinen Bedarf und "bisserl" RAM zum cachen vorsehen ....
und öfters das FS warten (Cron/at und FS optimieren) ....
(vermute dein bisheriges System war was windows artiges)
Mit nem RDBMS statt Filesystem z.b. wirst IMHO auch nicht viel weiter kommen, weil die am Ende nur die selben probleme lösen nur eben mit mehr overhaed. ^^
Ciao ....
Ich weiss nicht warum und wieso du hier die Ringspeicher Strategie nutzt, aber evtl wäre es sinnvoller hier auf eine andere Strategie umzusteigen also einen permanenten FileStream zu nutzen, und das Ergebniss fallweise wegzukopieren(im idealfall auf eine andere hdd). Andernfalls läufst du aus meiner Sicht immer in die Fragmentierungsfalle.
Hallo inek,
wenn du zwei Festplatten nimmst (können auch zwei Partitionen auf einer physischen Platte sein), und die du immer abwechselnd (fast) komplett vollschreibst und dann die andere komplett(!) löscht, bevor du sie wieder voll schreibst, sollten keine Probleme mit Fragmentierung entstehen.
herbivore
Idee:
Sobald Du die 1. Hälfte der Aufnahmeperiode beginnst auf Festplattenpartition A zu schreiben, kannst Du
Festplattenpartition B fragmentieren lassen.
Bei der 2. Hälfte der Aufnahmeperiode wechselst Du dann die Festplattenpartitionen und machst dann das gleiche wieder.
Die Festplattenpartitionen sollten sich in diesem Fall auf unterschiedliche Festplatten befinden.
hm.. werde ich so nicht lösen können da ich alle Daten für einen Zeitraum von x Tagen bereithalten muss.. kann also nicht viel auf einmal löschen.. bzw. bräuchte ich sonst ne recht hohe Überkapazität an Speicherplatz
Hallo inek,
ja, durch den Vorschlag entsteht eine Überkapazität. Die wird aber deutlich billiger zu beschaffen sein, als es kostet, eine andere, kompliziertere Lösung zu erarbeiten. Zudem hat man hier mit sehr wenig Aufwand eine sehr zuverlässige Lösung.
Die Überkapazität lässt sich senken, indem man die Anzahl der Partitionen erhöht. Wenn du z.B. fünf statt zwei Partitionen zyklisch beschreibst, und die jeweils die eine Partition komplett löschst, bevor du anfängst sie neu zu beschreiben, dann benötigst du statt 100% Überkapazität nur noch 25%. Natürlich kann man die Partitionen dabei nicht beliebig klein machen, sonst hat man zu viel Verschnitt (also der Restplatz, der leer bleibt, bevor man zur nächsten Partition wechselt). Aber man wird eine Aufteilung finden, bei der die Überkapazität im vertretbaren Rahmen bleibt.
herbivore