2016-08-03 43 views
0

Ich implementiere meine eigenen Redis in C. Ich habe Bitmap durch Zuweisen genügend genügend Speicher zu halten n unsigned longs (sagen Worte) und dann mit Word-Offset und Bit-Offset zu setzen/ein Bit an einer pos Position löschenC Schreiben/Lesen von Memory-Snapshot zu/von Disk

word_offset = pos/BITS_PER_WORD; 
bit_offset = pos % BITS_PER_WORD; 

Nächster Schritt dieses Bitmap es durch das Schreiben auf die Festplatte zu bestehen, kann das lesen wieder zurück, um die Bitmap wiederherzustellen.

Als eine erste und naive Annäherung, ich versuchte, Speicher Wort für Wort zu lesen und dieses unsigned lange in eine Datei zu schreiben. Es funktioniert, sieht aber hässlich aus, arbeitet langsam und fühlt sich dumm an, da eine Bitmap bis zu 512 MB groß werden kann.

Darüber hinaus muss ich mehrere solcher Bitmaps in einer einzigen Datei speichern.

Wie kann ich einen effizienten Ansatz zum Speichern meiner Datenstrukturen auf Festplatte erstellen? Da es sich um ein Lernprojekt handelt, vermeide ich es, in den Redis-Quellcode zu schauen.

+1

Ich bin mir nicht sicher, ob Sie Recht damit haben, den Redis-Quellcode zu übersehen. Sie werden viel lernen, wenn Sie hineinschauen. –

+0

Ich werde definitiv in den Redis-Quellcode schauen, wie kann ich es mir leisten, ein solches Stück Technik zu vermeiden. Ich möchte es nur selbst programmieren, dann kann ich vergleichen und daraus lernen. –

+0

Aber ich bin mir sicher, dass Sie mehr lernen, wenn Sie in umgekehrter Reihenfolge arbeiten: Redis-Quellcode studieren und dann Ihren eigenen "Klon" kodieren. Außerdem ist Ihre Frage OS-spezifisch. Wenn unter Linux, lesen Sie http://advancedlinuxprogramming.com/ –

Antwort

2

Siehe fwrite:

#include <stdio.h> 

size_t fwrite(const void *restrict ptr, size_t size, size_t nitems, 
     FILE *restrict stream); 

Die fwrite() Funktion schreiben soll, aus dem Array von ptr wies bis zu nitems Elementen, deren Größe sich nach der Größe festgelegt, um den Strom zu Strom durch spitz. Für jedes Objekt müssen Aufrufe der Größe an die Funktion fputc() erfolgen, wobei die Werte (in der Reihenfolge) von einem Array von unsignierten Zeichen übernommen werden, die genau über dem Objekt liegen. Der Dateipositionsindikator für den Datenstrom (falls definiert) soll um die Anzahl der erfolgreich geschriebenen Bytes vorgerückt werden. Wenn ein Fehler auftritt, ist der resultierende Wert des Dateipositionsindikators für den Stream nicht angegeben.

Die entsprechende Funktion für Lesevorgänge ist fread.

Wenn POSIX die einzige Voraussetzung ist, verwenden Sie write:

#include <unistd.h> 

ssize_t pwrite(int fildes, const void *buf, size_t nbyte, 
     off_t offset); 
ssize_t write(int fildes, const void *buf, size_t nbyte); 

Die write() Funktion versuchen soll nbyte Bytes aus dem Puffer von buf in die Datei darauf zu schreiben, mit dem offenen Dateideskriptor zugeordnet ist, fildes .

Die entsprechende Funktion für die Lesevorgänge ist read.