繁体   English   中英

使用“内存映射文件”读取大xml数据的模式是什么?

[英]what the schema of reading big xml data using “Memory Mapped Files”?

我有一个很大的xml文件(要解析的osm地图数据文件)。 要处理的初始代码如下:

FILE* file = fopen(fileName.c_str(), "r");
size_t BUF_SIZE = 10 * 1024 * 1024;
char* buf = new char[BUF_SIZE];
string contents;
while (!feof(file))
{
    int ret = fread(buf, BUF_SIZE, 1, file);
    assert(ret != -1);
    contents.append(buf);
}

size_t pos = 0;
while (true)
{
    pos = contents.find('<', pos);
    if (pos == string::npos) break;

    // Case: found new node.
    if (contents.substr(pos, 5) == "<node")
    {
      do something;
    }

    // Case: found new way.
    else if (contents.substr(pos, 4) == "<way")
    {
       do something;
    }
}

然后这里的人告诉我,我应该使用内存映射文件来处理那些“大数据文件”,详细信息在这里: 如何将大文件读入缓冲区

我的意思是当它是固定大小并且不是很大时,可以将一次加载到内存中并将内容附加到字符串对象中,然后可以应用find()方法和其他字符串方法来提取节点的内容xml文件。 (我的问题开头的代码使用此方法,我测试将产生正确的结果)。 然后,如果文件很大,如何应用这些方法(不使用诸如libxml之类的xml库)?

一句话,对于小型xml文件,我可以将整个内容加载到std :: string并应用find(),substr()操作,并在xml文件中获取所需的信息。 当xml文件很大时,我需要使用内存映射文件来应对。 然后可以将整个内容附加到std :: string,我如何不使用exsit xml库解析文件?

希望我能清楚地表达我的问题。

如果您使用std :: string成员来获取所需的数据,则几乎可以肯定,您不是在解析XML的传统意义上解析XML。 (也就是说,您很可能没有使用XML的层次结构。尽管您是从XML提取数据,但是“解析XML”对于大多数人而言意味着更具体的事情。)

也就是说,您似乎可以接受的std::string成员的C等效项,例如memcmp和GNU扩展memmem ,只需使用指针和长度即可。 阅读他们的文档,并使用它们代替其std:;string :; std:;string -member等效项。

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM