2016-08-03 85 views
0

我正在C中實現我自己的Redis我設計了位圖分配足夠的內存來保存n無符號長整數(例如單詞),然後使用字偏移和位偏移來設置/在一個位置posC寫入/讀取內存快照到/從磁盤

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

下一步是將其寫入磁盤堅持這個位圖清除位,可以再次回讀,以恢復該位圖。

作爲第一個也是幼稚的方法,我試圖逐字閱讀內存,並將此無符號長寫入文件。它可以工作,但看起來很醜陋,工作速度慢,感覺很蠢,因爲位圖可以長到512MB。

此外,我必須將多個這樣的位圖存儲到單個文件。

如何設計一種有效的方法將我的數據結構保存到磁盤。由於這是一個學習項目,我避免偷看Redis源代碼。

+1

我不確定你是否正確避免查看Redis源代碼。你會看到它學到很多東西。 –

+0

我一定會看看redis源代碼,我該如何負擔得起這樣的工程。我只想先自己編碼,然後我可以比較並從中學習。 –

+0

但是我相信你可以通過相反的順序學習更多知識:研究Redis源代碼,然後編寫你自己的「克隆」。另外,你的問題是操作系統特定的。如果在Linux上,請閱讀http://advancedlinuxprogramming.com/ –

回答

2

參見fwrite

#include <stdio.h> 

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

fwrite()功能必須寫,從陣列指向ptr,至多nitems元件,其大小由大小指定,到流指向流。對於每個對象,應調用fputc()函數的大小調用,將無符號字符數組中的值(按順序)精確地覆蓋該對象。流(如果已定義)的文件位置指示符應按成功寫入的字節數進行提前。如果發生錯誤,則未指定該流的文件位置指示符的結果值。

讀取的相應函數是fread

如果POSIX是唯一的要求,使用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); 

write()功能應嘗試寫從緩衝區nbyte字節指向buf與打開的文件描述符相關的文件,fildes

讀取的對應函數是read