我在C中实现了自己的Redis。我通过分配足够的内存来保存n
无符号长(比如说单词)然后使用字偏移和位偏移来设置/清除来设计位图位于pos
word_offset = pos / BITS_PER_WORD;
bit_offset = pos % BITS_PER_WORD;
下一步是通过将此位图写入磁盘来保留此位图,可以再次读回以恢复位图。
作为第一个天真的方法,我试图逐字读取内存,并将此unsigned long写入文件。它有效,但看起来很丑,工作缓慢而且感觉愚蠢,因为位图的大小可以达到512mb。
此外,我必须将多个这样的位图存储到单个文件中。
如何设计一种将数据结构保存到磁盘的有效方法。由于这是一个学习项目,我正在避免偷看Redis源代码。
答案 0 :(得分:2)
请参阅fwrite:
#include <stdio.h>
size_t fwrite(const void *restrict ptr, size_t size, size_t nitems,
FILE *restrict stream);
fwrite()
函数应从ptr
指向的数组写入由size指定的nitems
个元素到stream指向的流。对于每个对象,应对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。