我正在研究一段代码,其目标是成为一个快速的"搜索引擎".我在一个文件中有条目,需要在读取整个文件后进行搜索.它们需要可以通过条目的名称进行搜索,并且它从文件的开头偏移.我的问题是内存使用问题,因为有数百万条目.目前我使用两个单独的std :: maps来存储数据,以便可以指定任一搜索项.这导致数据的双重存储,这正是我试图减少的.
我已经使用valgrind massif来发现内存使用的主要部分是条目的双重存储.
目前的储存方法:
struct entry {
std::string name;
uint16_t offset;
uint16_t size;
bool isConst;
};
nameSearchMap.insert(std::pair<std::string, entry>(s_entry.name, e_entry));
offsetSearchMap.insert(std::pair<uint16_t, SymInfo>(s_entry.offset, s_entry));
Run Code Online (Sandbox Code Playgroud)
有没有办法可以制作一个可以通过任何一种键搜索的地图?
你可以考虑使用
std::map<std::string, std::shared_ptr<entry>>
Run Code Online (Sandbox Code Playgroud)
用于将字符串映射到条目,以及
std::map<uint16_t, std::shared_ptr<entry>>
Run Code Online (Sandbox Code Playgroud)
请注意,通过使用值有效负载的共享指针(因此entry对两个映射使用相同的对象),可以保存有效负载的大小.虽然您需要支付两个共享指针,但您仍然可以提前了解特定结构.
(感觉就像绘制图表.但重点是entry内存中只有一个对象.)
您可能也有兴趣boost::bimap.