创建数据库并希望写入磁盘而不是保存在 RAM 中

Posted

技术标签:

【中文标题】创建数据库并希望写入磁盘而不是保存在 RAM 中【英文标题】:Creating a Database and want to write out to disk and not keep in RAM 【发布时间】:2018-01-03 22:42:34 【问题描述】:

您好,我正在用 C 语言编写数据库,并希望将数据写入硬盘驱动器,不再将其存储在 RAM 中。有没有办法做到这一点?

目前我创建了一个大文件并打开它

fd = open("database.dat",O_CREAT | O_RDWR);
hd = mmap(0, SSD_SIZE, PROT_READ | PROT_WRITE, MAP_SHARED, fd, 0);

然后写入已经映射好的内存地址,然后

msync(dest,DB_PAGE_SIZE, MS_SYNC);

dest 在映射区域中的位置。

【问题讨论】:

Oracle、Informix、DB2、PostgreSQL、Sybase、mysql、MS SQL Server 等 DBMS 都可以管理它——我不明白为什么你不能。当然,您必须设计系统才能正常工作,这并非易事,但肯定可以做到。 【参考方案1】:

mmap() 只是将文件映射到虚拟地址空间,它不会将整个文件加载到 RAM 中。在 32 位操作系统上,您的数据库将受到可用地址空间的限制,但在 64 位操作系统上 mmap() 应该没问题。

因此,假设您的操作系统是 64 位,如果您的解决方案非常好:操作系统将管理映射,因此最近使用的页面将在 RAM 中,并且在内存压力的情况下,页面将自动写回磁盘。

【讨论】:

以上是关于创建数据库并希望写入磁盘而不是保存在 RAM 中的主要内容,如果未能解决你的问题,请参考以下文章

如何在 ram 中创建目录并获取它的路径? [复制]

C代码测量Linux中的磁盘写入时间并处理RAM缓冲

如何在内存中创建一个文件供用户下载,而不是通过服务器?

如何在内存中创建一个文件供用户下载,而不是通过服务器?

如何将数据持久保存到磁盘,并随机更新它,并将其有效地流式传输回 RAM?

在磁盘上实现的 FIFO 队列(或堆栈),而不是 ram(最好在 C++ 中)[关闭]