Laden...

Dateien ohne Fragmentierung speichern

Erstellt von inek vor 9 Jahren Letzter Beitrag vor 9 Jahren 4.847 Views
inek Themenstarter:in
182 Beiträge seit 2007
vor 9 Jahren
Dateien ohne Fragmentierung speichern

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.

49.485 Beiträge seit 2005
vor 9 Jahren

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

Gelöschter Account
vor 9 Jahren

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)

C
1.214 Beiträge seit 2006
vor 9 Jahren

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.

16.842 Beiträge seit 2008
vor 9 Jahren

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.

inek Themenstarter:in
182 Beiträge seit 2007
vor 9 Jahren

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.

16.842 Beiträge seit 2008
vor 9 Jahren

Naja, in der Menge und mit dem Speicherelement wirst Du kaum Einfluss auf die Fragmentierung nehmen können.

inek Themenstarter:in
182 Beiträge seit 2007
vor 9 Jahren

Ne alternative idee ?

16.842 Beiträge seit 2008
vor 9 Jahren

Circular Buffer Prinzip pflicht?

H
3 Beiträge seit 2014
vor 9 Jahren

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:

  • geeignetes filesystem wählen
  • Datenkompression, damit daten vermindern
  • extensives caching betreiben.

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 ....

Gelöschter Account
vor 9 Jahren

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.

49.485 Beiträge seit 2005
vor 9 Jahren

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

C
224 Beiträge seit 2009
vor 9 Jahren

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.

inek Themenstarter:in
182 Beiträge seit 2007
vor 9 Jahren

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

49.485 Beiträge seit 2005
vor 9 Jahren

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