Ich habe eine Anwendung (die zur Zeit in Python geschrieben ist, während wir die Einzelheiten ausbügeln, aber irgendwann wird es in C geschrieben sein), die einzelne Datensätze verwendet, die in einfachen Textdateien gespeichert sind. Wir können keine Datenbank verwenden und neue Datensätze müssen regelmäßig manuell hinzugefügt werden.
Meine Frage lautet: Wäre es schneller, eine einzige Datei zu haben (500k-1Mb) und meine Anwendung geöffnet, durchlaufen, finden und schließen einer Datei ODER wäre es schneller, die Datensätze zu trennen und mit einigen zu benennen entsprechende Konvention, so dass die Anwendung einfach über Dateinamen laufen konnte, um die benötigten Daten zu finden?
Ich weiß, dass meine Frage ziemlich allgemein ist, so dass die Richtung zu jedem guten Artikel über das Thema ebenso geschätzt wird wie Vorschläge.
Vielen Dank im Voraus für Ihre Zeit, Dan
Im Wesentlichen ist Ihr zweiter Ansatz ein Index - Sie bauen Ihren Index nur im Dateisystem selbst auf. Es ist nichts an sich falsch, und solange Sie die Dinge so arrangieren, dass Sie nicht zu viele Dateien in dem einen Verzeichnis bekommen, wird es schnell gehen.
Sie können das Ziel "Nicht zu viele Dateien in einem Verzeichnis speichern" erreichen, indem Sie mehrere Ebenen von Verzeichnissen verwenden. Beispielsweise könnte der Datensatz mit dem Schlüssel FOOBAR in data/F/FO/FOOBAR
und nicht nur in data/FOOBAR
gespeichert werden.
Alternativ können Sie auch die Single-Large-Datei ausführen, indem Sie eine Indexdatei erstellen, die eine (sortierte) Liste von Schlüssel-Offset-Paaren enthält. Wenn der Ansatz Verzeichnisse-als-Index nach unten fällt, wenn Sie nach einem Schlüssel suchen möchten, der sich von dem unterscheidet, den Sie zum Erstellen der Dateinamen verwendet haben - wenn Sie eine Indexdatei verwendet haben, können Sie einfach einen zweiten Index für diese Situation erstellen.
Sie sollten die Einschränkung "Wir können keine Datenbank verwenden" noch einmal überdenken, da Sie eigentlich nur Ihre eigene Datenbank erstellen.
Das Lesen eines Verzeichnisses ist im Allgemeinen teurer als das Lesen einer Datei. Aber wenn Sie die gewünschte Datei finden können, ohne das Verzeichnis zu lesen (d. H. Nicht "über Dateinamen laufen lassen", sondern aufgrund der Namenskonvention einen Dateinamen erstellen), kann es nützlich sein, Ihre Datenbank zu teilen.
Wenn Ihre Daten 1 MB groß sind, würde ich sogar überlegen, sie vollständig im Speicher zu speichern.
Um Ihnen einen Anhaltspunkt für Ihre Frage zu geben, würde ich meinen, dass eine einzelne große Datei bedeutet, dass Ihre Anwendung die Verwaltung der Zeilen übernimmt. Wenn mehrere kleine Dateien vorhanden sind, müssen das System und das Dateisystem die Daten verwalten. Letzteres kann jedoch ziemlich langsam sein, da es Systemaufrufe für alle Ihre Operationen beinhaltet.
Im Allgemeinen ist es besser, mehrere kleine Dateien zu haben. Hält die Speicherauslastung niedrig und die Leistung ist bei der Suche viel besser.
Aber es hängt von der Anzahl der Operationen ab, die Sie benötigen, weil Dateisystemaufrufe im Vergleich zum Speicher viel teurer sind.
Der allgemeine Nachteil besteht darin, dass das Aktualisieren einer großen Datei schwieriger sein kann, aber viele kleine Dateien sind knifflig. Mein Vorschlag würde sein, dass, wenn Sie mehrere Dateien verwenden und Sie am Ende viel haben, es sehr langsam werden kann, ein Verzeichnis mit einer Million Dateien darin zu durchlaufen. Wenn möglich, brechen Sie die Dateien in eine Art Gruppierung auf, so dass sie in separate Verzeichnisse eingefügt und "gekeyed" werden können. Ich habe eine Anwendung, die die Erstellung von vielen kleinen PDF-Dokumenten für alle Benutzer des Systems erfordert. Wenn wir das in ein Verzeichnis schreiben, wäre das ein Alptraum, aber ein Verzeichnis pro Benutzer-ID macht es viel einfacher zu verwalten.
Das Öffnen der Datei und das Schließen der Datei in C würde sehr lange dauern Das heißt, Sie haben 500 Dateien mit je 2 KB ... und wenn Sie es verarbeiten, würde Ihrer Anwendung 1000 Additonal Operation hinzugefügt werden (500 Eröffnungsdatei und 500 Closing) ... während Sie nur 1 Datei mit 1 MB Größe speichern würden 1000 zusätzliche Operation ... (Das ist nur meine persönliche Meinung ...)
Dies hängt unter anderem von Ihrem Dateisystem, der Blockgröße und dem Speichercache ab.
Wie üblich, messen und herausfinden, ob dies ein echtes Problem ist, da eine vorzeitige Optimierung vermieden werden sollte. Es kann sein, dass die Verwendung einer Datei im Vergleich zu vielen kleinen Dateien für die Leistung in der Praxis nicht sehr wichtig ist und dass die Auswahl stattdessen auf Klarheit und Wartbarkeit basieren sollte.
(Was ich sicher sagen kann, ist, dass Sie nicht auf die lineare Dateisuche zurückgreifen sollten, verwenden Sie stattdessen eine Namenskonvention, um die Datei in O (1) -Zeit zu lokalisieren).
Warum kannst du keine DB benutzen, bin ich neugierig? Ich respektiere deine Vorliebe, aber ich möchte nur sicherstellen, dass es aus dem richtigen Grund ist.
Nicht alle DBs erfordern einen Server für die Verbindung mit einer komplexen Bereitstellung. SQLite kann beispielsweise einfach in Ihre Anwendung eingebettet werden. Python hat es bereits eingebaut und es ist sehr einfach, sich mit C-Code zu verbinden (SQLite selbst ist in C geschrieben und seine primäre API ist für C). SQLite verwaltet eine DB mit Funktionsmerkmalen in einer einzigen Datei auf der Festplatte, auf der Sie mehrere Tabellen erstellen und alle anderen nützlichen Funktionen einer Datenbank nutzen können.
Tags und Links c performance