我正在使用 C++ 中的 json_spirit 库来解析一个 200 mb 的 json 文件。令我惊讶的是,当我的程序读入内存时,我的 RAM 被使用了 1.5 GB。这是反序列化json时所期望的吗?
这是我在 json 文件中加载的方式:
std::ifstream istream(path.c_str());
json_spirit::mValue val;
json_spirit::read(istream, val);
你可以试试rapidjson。
它针对内存使用和性能进行了优化。
通过使用原位解析选项(即它改变解析的源字符串),它只需要每个 JSON 值产生 16 个字节来存储 32 位架构中的 DOM。字符串值将使用指向修改后的源字符串的指针。
我希望内存使用量会少得多。
另一方面,rapidjson 也支持 SAX 风格的解析。如果应用程序只需要从头到尾遍历 JSON 文件(例如做一些统计),那么 SAX 风格的 API 会更快,而且内存消耗非常少(程序堆栈 + 字符串值的最大长度)。
我认为,这不依赖于 JSON。这更多的是数据结构开销的问题。如果您有许多小对象,则管理部分变得越来越重要。
虽然,超过七倍的开销,似乎真的过分了。