2016-07-10 16 views
0

Angenommen, Sie haben eine Datendatei, in die eine Anwendung schreibt. Sobald die Daten gelesen sind, hat es keine Verwendung, so dass es gelöscht werden kann, um Platz zu sparen. Hier mein Entwurf für den Umgang mit diesem:Löschen von bereits gelesenen Daten aus Datei auf Systemebene

1) Sobald die Datei eine bestimmte Größe erreicht, erhalten Sie eine Sperre auf 2) Sehen Sie sich den Index (Zeiger, der das Byte in der Datei, die Sie gerade sind) eines Lesevorgangs rufen Sie in der Vnode Tabelle für diese Datei 3) Löschen Sie alle Datei Daten, die vor dem Index 4) Aktualisieren Sie den Index des gelesenen Aufrufs an den neuen Anfang der Datei 5) Entsperren Sie die Datei, so dass Lesen/Schreiben kann fortgesetzt werden

Ich habe nicht viel Systemerfahrung selbst, aber ich nehme an, dass, wenn dies auf Systemebene getan wird, es sprachunabhängig ist (dh wenn eine Anwendung einen Java-Aufruf oder einen Python-Aufruf zum Lesen/Schreiben verwendet) Nein Problem).

Die Datendatei befindet sich auf einem Unix-v6-Dateisystem. Das Überwachen der Größe einer Datei und das Löschen von Daten ist kein Problem, aber ich kann keinen Systemaufruf finden, um 1) auf andere Einträge in der vnode-Tabelle zuzugreifen, um zu sehen, wo sie sich beim Lesen der Datei befinden und 2) die Lesezeiger von aktualisieren diese Systemaufrufe.

Antwort

0

Ein Unix v6 Dateisystem macht keinen Sinn. Ich bin sicher, Sie meinen nicht das v6 Unix-System, das von Bell Labs für die PDP-11 im Jahr 1975 veröffentlicht wurde; Zum einen bin ich mir sicher, dass Java oder Python nie unterstützt wurde! Sie müssen wahrscheinlich ein bisschen genauer sein, welches System Sie meinen. Es kann nicht OpenBSD sein (das bisher noch keine Version 6 veröffentlicht hat), oder FreeBSD (das bis Version 10 und Version 6 läuft, wäre ziemlich veraltet). Vielleicht NetBSD?

In jedem Fall würde ich nicht empfehlen, zu versuchen, Änderungen im Kernel zu machen, um dies zu unterstützen, da es sehr unportabel wäre und viel schwieriger als Sie denken, die Dinge richtig zu machen. Insbesondere ist das Umnummerieren der Zuordnung zwischen logischen zu physikalischen Blöcken tricky. Es gibt Betriebssysteme und Dateisysteme (wie ext4 und xfs von Linux), die die Operation PUNCH HOLE unterstützen, bei der Blöcke zwischen spezifizierten Anfangs- und End-Offset aufgehoben werden, solange diese Offsets ein Vielfaches der Blockgröße des Dateisystems sind. Sie können sogar eine COLLAPSE RANGE-Operation verwenden, die Bytes vom Anfang oder von der Mitte der Datei "löscht" - aber wieder müssen sie ein Vielfaches der Dateisystemblockgröße sein, und sie werden die Dateioffsets nicht beeinflussen von irgendwelchen offenen Dateideskriptoren. COLLAPSE RANGE ist im Allgemeinen eine wirklich schlechte Idee, da alle zwischengespeicherten Seiten für die Datei eliminiert werden müssen, um die Konsistenz des Seitencaches beizubehalten. Die Zeiten, in denen es nützlich ist, sind extrem selten. Der Hauptanwendungsfall scheinen Leute zu sein, die wirklich große Videodateien manipulieren. Aber architektonisch ist dies fast sicher nicht was Sie tun möchten.

Was ich empfehlen würde, dies in Userspace zu tun. Ja, es bedeutet, dass Sie Unterstützung in Java und Python implementieren müssen, aber vertrauen Sie mir, dies wird einfacher sein, als zu versuchen, Hacking auf Kernel und Dateisystemebene durchzuführen. Wenn Sie wirklich darauf bestehen, können Sie eine C-Bibliothek erstellen und dann SWIG-Schnittstellen erstellen, die von Java und Python aufgerufen werden können. Es ist jedoch wahrscheinlich einfacher, die Logik zweimal in idiomatischen und nativen Java- und Python-Code neu zu implementieren.

Was ich tun würde, ist der Writer schreiben in Chunks, die ungefähr 1 Megabyte Größe oder so sind, sobald ein Chunk eine bestimmte Größe erreicht, starten Sie einen neuen Chunk in einer neuen Datei. Benennen Sie die Chunks numerisch --- d. H. Data0001, Data0002 usw. Der Leser kann einfach den Chunk lesen, und wenn er damit fertig ist, löschen Sie die Chunk-Datei und fahren Sie fort.

Wirklich einfach, und es wird Sie nicht in den Unkräutern verlieren zu versuchen, Kernel-Level-Hacking zu tun.

+0

Guter Haken - Ich meinte ein Unix-ähnliches Dateisystem, wie Sie es auf einem Linux-Server finden würden (ich habe über Unix v6 gelesen, um grundlegende Konzepte zu lernen). – pqx994

+0

Es scheint, als würde Ihr Vorschlag nicht funktionieren, weil ich nicht der Verfasser bin - stellen Sie sich vor, dass eine aktuell laufende Anwendung, die nicht meine ist, in die Datei schreibt. Ich kann die Anwendung nicht bearbeiten und schreiben, ich kenne nur den Dateinamen und habe Zugriff darauf. – pqx994

+0

@ pqx994 Könnten Sie die Anwendung einfach in einen Fifo schreiben lassen? –