C向磁盘写入/读取内存快照

C向磁盘写入/读取内存快照,c,memory-management,file-io,redis,C,Memory Management,File Io,Redis,我正在用C实现我自己的位图。我设计了位图,分配了足够的内存来容纳n无符号长字符(比如单词),然后使用单词偏移量和位偏移量来设置/清除pos word_offset = pos / BITS_PER_WORD; bit_offset = pos % BITS_PER_WORD; 下一步是通过将位图写入磁盘来持久化该位图,该磁盘可以再次读取以恢复位图 作为第一种简单的方法,我尝试逐字读取内存,并将这个无符号长文件写入文件。它可以工作,但看起来很难看,工作速度慢,感觉很哑,因为位图的大小可以增长到5

我正在用C实现我自己的位图。我设计了位图,分配了足够的内存来容纳
n
无符号长字符(比如单词),然后使用单词偏移量和位偏移量来设置/清除
pos

word_offset = pos / BITS_PER_WORD;
bit_offset = pos % BITS_PER_WORD;
下一步是通过将位图写入磁盘来持久化该位图,该磁盘可以再次读取以恢复位图

作为第一种简单的方法,我尝试逐字读取内存,并将这个无符号长文件写入文件。它可以工作,但看起来很难看,工作速度慢,感觉很哑,因为位图的大小可以增长到512mb

此外,我必须将多个这样的位图存储到一个文件中

如何设计有效的方法将数据结构保存到磁盘。由于这是一个学习项目,我避免偷看Redis源代码。

请参阅:

write()
函数应尝试将
nbyte
字节从
buf
指向的缓冲区写入与打开的文件描述符相关联的文件
fildes

读取的相应功能是。

请参阅:

write()
函数应尝试将
nbyte
字节从
buf
指向的缓冲区写入与打开的文件描述符相关联的文件
fildes


读取的相应函数是。

我不确定您是否正确地避免查看Redis源代码。我一定会研究redis的源代码,我怎样才能避免这样的工程。我只是想先自己编写代码,然后我可以比较和学习。但我相信你可以通过相反的顺序学习更多:学习Redis源代码,然后编写你自己的“克隆”。另外,您的问题是特定于操作系统的。如果在Linux上,请阅读我不确定您是否正确地避免查看Redis源代码。我一定会研究redis的源代码,我怎样才能避免这样的工程。我只是想先自己编写代码,然后我可以比较和学习。但我相信你可以通过相反的顺序学习更多:学习Redis源代码,然后编写你自己的“克隆”。另外,您的问题是特定于操作系统的。如果在Linux上,请阅读
#include <stdio.h>

size_t fwrite(const void *restrict ptr, size_t size, size_t nitems,
       FILE *restrict stream);
#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);