C向磁盘写入/读取内存快照
我正在用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
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);