Frage

könnte jemand mir helfen versuchen, wie Festplatte sucht Werke zu verstehen.

Ich habe eine kleine binäre Datenbankdatei, die die Leistung gelesen absolut notwendig ist. Wenn ich ein paar Bytes in der Datei überspringen muß, ist es schneller suchen () zu verwenden oder zu lesen () dann die unerwünschten Daten verwerfen.

Wenn die durchschnittliche Zeit von einer Festplatte sucht, ist 10 ms und die Lesegeschwindigkeit ist I 300MB / s berechnet, dass es schneller ist () zu lesen, als seek () mit einem Wert kleiner als 3 MB. Ist wahr? Gibt es einen Overhead, wenn eine neue suchen Durchführung, die einen bestehenden Stream gelesen haben oder nicht?

Was halten Sie für eine geeignetere Dateistruktur für einen Index sein.

Entry1:Value:PointerIntoToData
Entry2:Value:PointerIntoToData
Entry3:Value:PointerIntoToData
Data, Data, Data

Or

Entry1:Value:Data
Entry2:Value:Data
Entry3:Value:Data

Wenn Sie einen Eintrag zu lesen, wenn der Wert nicht korrekt ist, wird es ignoriert. Also, wenn Sie die Datei-Streaming ist es schneller: 1. wenn ein Eintrag nicht erforderlich Verwendung seek () über sie überspringen 2. wenn ein Eintrag nicht erforderlich ist, lesen Sie es dann die Daten verwerfen 3. oder die Verwendung erste Struktur wird, wenn ein Eintrag zu suchen benötigt () in einen Datenspeicher am Ende.

Eintrag ist 4 Byte-Wert ist 8 Byte Daten & 12KB

Prost

War es hilfreich?

Lösung

Alle suchen Systemaufruf eine Position in Datei nicht verändert, wo die nächste gelesen wird. Es muss nicht den Antriebskopf bewegen. Antriebsköpfe bewegen, wenn Daten gelesen oder geschrieben werden, und Sie haben keine direkte Kontrolle über das, was O als nächstes tun wird.

viele Daten Lesen Sie nicht Auswirkungen gehen zu müssen, hat, weil alle Datenraum in OS Puffer lesen muss und bewirkt, dass ältere Daten verworfen werden. So große Dateien mit sucht über verwirren mit Dateisystem-Cache weniger.


Alles, was ich unter schreiben vorausgesetzt, dass Sie nicht die gesamte Datenbank in den Speicher passen kann. Wenn Sie können, genau das tun. Lesen Sie alles und versuchen, neue und geänderte Daten am Ende der Datei anzuhängen. Nicht über verschwendete Speicherplatz Sorge, gerade in einer Zeit lang einige Verdichten einmal tun.


Wenn Ihre Datenbank zu groß ist:

Die Daten werden in Blöcken (oder Seiten) zu physischem Laufwerk gelesen und geschrieben. Ebenso ist die Grundeinheit der Disk IO in Ihrem OS-Seite. Wenn die OS-Daten von der Festplatte speichert, es ist auch in ganzen Seiten. So überlegen, ob Sie nach vorne paar Bytes verschieben müssen mit suchen oder macht wenig Sinn lesen. Wenn Sie es schnell machen wollen, müssen Sie berücksichtigen, wie Disk IO wirklich funktioniert.

Zuerst bereits von nobugz, Referenzlokalität erwähnt. Wenn die Daten, die Sie in jeder Operation verwenden befindet sich nahe beieinander in einer Datei, Ihr Betriebssystem muß weniger Seiten lesen oder zu schreiben. Auf der anderen Seite, wenn Sie Ihre Daten verbreiten, müssen viele Seiten auf einmal gelesen oder geschrieben werden, was immer langsam sein wird.

In Bezug auf Datenstruktur für den Index. Typischerweise sind sie organisiert wie B-Bäume . Es ist eine aus Datenstruktur speziell für eine effektive Suche von großen Datenmengen im Speicher mit ausgelagertem liest und schreibt.

Und beide Strategien für die Daten zu organisieren in der Praxis eingesetzt. Zum Beispiel MS SQL Server standardmäßig Daten speichern die erste Möglichkeit: Daten werden getrennt gespeichert und Indizes nur Daten aus indexierten Spalten und physikalischen Adressen von Datenzeilen in Dateien enthalten. Aber wenn Sie Clustered-Index definieren, dann werden alle Daten in diesem Index gespeichert werden. Alle anderen Indizes werden über Clustered-Index Schlüssel zu den Daten zeigen, anstatt physikalische Adresse. Der erste Weg ist einfacher, aber das anderes kann viel effektiver sein, wenn Sie oft Scans von Bereichen von Daten zu tun, basierend auf gruppierten Index.

Andere Tipps

Wie „absolut notwendig“ ist, den Zugang zu suchen? Haben getestet Sie Ihre Anwendung mit einer nicht-optimalen Lösung noch? Während dieser Tests haben Sie Benchmark, um zu bestimmen, wo die real Engpässe sind? Wenn Sie nicht haben, werden Sie von den Ergebnissen überrascht sein.

Als nächstes versuchen, verschiedene Methoden und die Laufzeiten vergleichen. Test unter verschiedenen Systemlasten (dh, wenn das System außer für Ihre Anwendung im Leerlauf ist, und wenn es besetzt ist).

Beachten Sie, dass Ihre Optimierungen auf der Grundlage Ihrer aktuellen Festplatte falsch werden kann, wenn eine neue, schnellere Festplatte verschiedene interne Optimierungen hat, die Ihre Arbeit aus dem Fenster werfen.

Eine sequentielle Lese ist immer schneller als eine, die einen Kopf sucht (nicht Position suchen) erfordert. Typische Festplatte perf beim sequentiellen Lesen 50-60 MB / sec, sucht Tropfen, die bis zu einer Worst-Case ~ 0,4 MB / s. Sobald die Antriebsköpfe positioniert sind, erhalten Sie im Wesentlichen die Daten im Zylinder kostenlos. Der Dateisystem-Cache nutzt, dass durch Vorablesen Sektor von einem Zylinder.

Sie haben jedoch keine Kontrolle über die Platzierung Ihrer Daten auf Festplattenzylindern. Auch können Sie die Laufwerksgeometrie erraten. Beachten Sie, dass der Durchsatz deutlich schlechter im Laufe der Zeit, wenn das Volumen fragmentiert wird. Sie werden für perf durch Caching Daten im Speicher zu suchen. Zu diesem Zeitpunkt Sie sich Sorgen über Referenzlokalität.

Sie können immer die Datei in den Speicher der Karte und dann über Zeiger zugreifen und so. Das sollte in der Regel Ihre Zugriffe einfacher und schneller machen.

Lizenziert unter: CC-BY-SA mit Zuschreibung
Nicht verbunden mit StackOverflow
scroll top