2017-03-05 3 views
1

TLDR;

Können Sie auf Datenträgerblöcke beim Schreiben auf Datenträger in JavaScript oder C# abzielen. Ist es wichtig, wenn Sie SSDs haben?B Bäume und spärlicher Indexalgorithmus in C# und JavaScript

Problem

Ich bin # eine BTree Implementierung in JavaScript und C zu schaffen.

Beim Lesen this section of wikipedia on btrees spricht es über spärliche Indizes und Senken der Festplattenlesevorgänge.

Es scheint mir, dass es über das Gruppieren von Indizes und Datensätzen in Festplattenblöcke geht, um das Lesen zu beschleunigen.

Fragen

ich einige Fragen:

  1. Can C# oder JavaScript (Node) Zielplattenblöcke, oder ist, dass Sie etwas in Ihrem Code zu berechnen? I.e. mit den Partitionstabellen der Festplatte arbeiten, um die Blockgröße und Chunk-Daten entsprechend zu ermitteln?

  2. Spricht Festplattenblock liest so viel, wenn wir SSDs haben.

Follow Up

Offensichtlich in C# Sie FileStream s und BinaryWriter s oder StreamWriter s schaffen können, aber sie nehmen nur byte[], man kann nicht überall insbesondere auf der Festplatte angeben - und um ehrlich zu sein, Ich erwarte viel von Schreiben auf die Festplatte wird in den unteren Ebenen behandelt - wie Kernel-und Festplattentreiber ....

Lesen mit SSDs macht alles soooo viel schneller, so effektiv, solange die BTree Knoten einen Verweis gehalten auf die genaue Datei und Byte-Marker (oder etwas ähnliches) dann specifezi Das in C# wäre einfach - und trotzdem blitzschnell. Es wäre eine einfache reader.Seek(/** some offset **/) und dann einfach in den Datensatz einlesen.

ich nicht einmal wissen würde, wo diese beginnen mit Knoten, um zu versuchen, es muss nur seine einfache fs.writeFile() Funktion ....

Antwort

1

1) Hochsprachen wie C# und JavaScript im Allgemeinen mit nicht kommen APIs, die speziell für Blöcke arbeiten, Sie müssen jedoch keine Partitionstabellen abfragen oder irgendetwas, um eine gute Blockgröße zu bestimmen.

Sektoren enthalten in der Regel 512 Byte Daten, aber die beste Größe für Ihre Anwendung ist wahrscheinlich größer als ein Sektor. Der teuere Teil des Lesens von der Festplatte ist (grundsätzlich) das Bewegen des Plattenkopfes auf die gewünschte Spur und dann das Warten auf den Sektor, den man auf der Platte drehen möchte, um ihn zu treffen.

Denken Sie an die Spur von Sektoren auf der rotierenden Scheibe. Nachdem sich der Kopf zu dem Sektor bewegt hat, den er will und liest, ist der nächste Sektor auf der Festplatte schon da. Wenn Sie diesen Sektor sofort lesen möchten, müssen Sie überhaupt keine teuren Umzüge machen.

Aus diesem Grund ist das Lesen weniger sequenzieller Sektoren nur ein wenig teurer als das Lesen eines Sektors, und normalerweise können Sie diese zusätzlichen Daten für etwas verwenden.

Wenn Ihr Betriebssystem Speicher oder Daten auf der Festplatte zwischenspeichern muss, liest und schreibt es in 4K-Blöcken. Sie sollten das als Minimum betrachten.

Wenn Sie die Blockgröße für Ihren B-Baum auswählen, ermitteln Sie, wie viele Schlüssel Sie in jedem Block haben werden, und wählen Sie die Größe, indem Sie die Kosten für zusätzlichen Messwert (relativ günstig) gegen die Kosten von Sie müssen zusätzliche Ebenen durchqueren, weil Ihre Blöcke zu klein sind (relativ teuer). Sie sollten testen, aber Ihre idealen Blöcke werden sehr wahrscheinlich größer als 4K sein.

2) Bei SSDs sind die Kompromisse unterschiedlich. Sie müssen sich nicht mehr um die Kosten von beweglichen Köpfen und rotierenden Platten sorgen, aber es ist immer noch schneller sequentielle Sektoren zu lesen. Sie sollten es erneut testen. Sie werden feststellen, dass die optimale Sektorgröße kleiner ist. Sie sollten dennoch nicht kleiner als 4K werden, da Ihre Daten den Betriebssystem-Cache durchlaufen und normalerweise 4K-Seiten verwenden.

+0

Coole, interessante Antwort. Ich würde nur sagen, dass ich über C# und JavaScript gesprochen habe .. nicht Java: P –

+0

@CallumLinington Das gilt auch für diese Sprachen. Ich habe den Text aktualisiert, um das widerzuspiegeln –

+0

Cool, bin ich derzeit stecken herauszufinden, wie zu teilen, wenn das obere Limit erreicht wurde ... –

Verwandte Themen