加入收藏 | 设为首页 | 会员中心 | 我要投稿 李大同 (https://www.lidatong.com.cn/)- 科技、建站、经验、云计算、5G、大数据,站长网!
当前位置: 首页 > 百科 > 正文

c – 我应该如何在内存中存储大量文本数据?

发布时间:2020-12-16 10:45:15 所属栏目:百科 来源:网络整理
导读:我正在研究一个c解析器,并想知道专家如何管理大量的文本/字符串( 100mb)来存储在内存中? 预计内容将以快节奏的方式随时访问. bg:redhat / gcc / libc 一个char数组将超出边界导致分段错误… 欢迎任何想法或经验分享/讨论…… 解决方法 如果您想随机访问该
我正在研究一个c解析器,并想知道专家如何管理大量的文本/字符串(> 100mb)来存储在内存中?
预计内容将以快节奏的方式随时访问.
bg:redhat / gcc / libc

一个char数组将超出边界导致分段错误…
欢迎任何想法或经验分享/讨论……

解决方法

如果您想随机访问该数据,mmap是处理存储在文件中的大量数据的最佳方式.

mmap告诉虚拟内存系统映射地址空间的连续部分以包含文件中找到的数据.虚拟内存系统将分配一系列地址空间,由该文件支持.当您访问该地址空间中的任何位置时,它将分配一页物理内存,从磁盘读取该文件的该部分,并将虚拟地址空间的该部分指向它用于读取文件的物理内存.当需要在物理内存中腾出更多空间时,它会写出对磁盘的任何更改(如果适用),并删除该部分虚拟地址空间的映射.

你会像这样使用它:

#include <sys/types.h>
#include <sys/stat.h>
#include <sys/mman.h> /* the header where mmap is defined */
#include <fcntl.h>

int file;
char *contents;
struct stat statbuf;
off_t len;

file = open("path/to/file",O_RDONLY);
if (file < 0)
  exit(1); /* or otherwise handle the error */

if (fstat(file,&statbuf) < 0)
  exit(1);

len = statbuf.st_size;

contents = mmap(0,len,PROT_READ,MAP_SHARED,file,0);
if (contents == MAP_FAILED)
  exit(1);

// Now you can use contents as a pointer to the contents of the file

// When you're done,unmap and close the file.

munmap(contents,len);
close(file);

(编辑:李大同)

【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容!

    推荐文章
      热点阅读