【问题标题】:C writing/reading memory snapshot to/from DiskC向/从磁盘写入/读取内存快照
【发布时间】:2016-12-09 05:18:56
【问题描述】:

我在 C 中实现我自己的Redis。我通过分配足够的内存来保存n unsigned longs(比如单词)然后使用字偏移量和位偏移量来设置/清除位图来设计位图位置pos

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

下一步是通过将其写入磁盘来持久保存此位图,可以再次读回以恢复位图。

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

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

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

【问题讨论】:

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

标签: c memory-management file-io redis


【解决方案1】:

fwrite:

#include <stdio.h>

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

fwrite() 函数应从ptr 指向的数组中,将大小由大小指定的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

【讨论】:

    猜你喜欢
    • 2018-10-16
    • 2015-07-19
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2021-12-29
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多