C++ 用c++;

C++ 用c++;,c++,stdvector,stdstring,C++,Stdvector,Stdstring,我一直在使用一些结构来缓存一些临时列表。 而且,我想找到一些解决方案,在保持性能的同时减少分配的内存。 结构的组件如下所示 structure LatestInfo { std::string visitedWebsites; std::string watchedVideo; std::string userId; std::string userName; unsigned int lastLoginTime;

我一直在使用一些结构来缓存一些临时列表。 而且,我想找到一些解决方案,在保持性能的同时减少分配的内存。 结构的组件如下所示

structure LatestInfo
{
        std::string visitedWebsites;
        std::string watchedVideo;
        std::string userId;
        std::string userName;
        unsigned int lastLoginTime;
        std::string contentsRating;
        //and so on
}
我有
std::vector latestList
来存储
LatestInfo
结构

最新列表中有许多
LastestInfo
,而且它越来越大

因此,它在我们的系统中分配了大量内存(超过200MB)

不仅
LatestInfo
定期更新(每2小时更新一次),而且性能也非常重要,我们只在DB(SQLite)中存储一些固定值

因此,我想在不使用DB的情况下减少其分配的内存

依我看,若std::string可以压缩,那个就很好了,只需要最少的更改。
您知道一些开源或库可以压缩它以减少分配的内存吗

或者你有更好的解决方案


谢谢。

如果您的字符串有很多重复项,您可以使用“字符串插入”,其中您只有一个字符串数据副本,然后指向它:

这是一个C++库,它为你做的(我没有用过这个,只是在我的谷歌搜索中出现):


如果您的字符串有很多重复项,您可以使用“字符串插入”,其中您只有一个字符串数据副本,然后指向它:

这是一个C++库,它为你做的(我没有用过这个,只是在我的谷歌搜索中出现):


我使用flyweight获得了有效的效果。 解决方案如下所示

#include <boost/flyweight.hpp>
structure LatestInfo
{
        flyweight<std::string> visitedWebsites;
        flyweight<std::string> watchedVideo;
        flyweight<std::string> userId;
        flyweight<std::string> userName;
        flyweight<std::string> lastLoginTime;
        flyweight<std::string> contentsRating;
        //and so on
}

std::map<unsigned int, LatestInfo> userMap;   //index per LatestInfo
#包括
后期结构
{
flyweight访问网站;
flyweight-watchedVideo;
flyweight用户标识;
flyweight用户名;
flyweight lastLoginTime;
飞锤含量测定;
//等等
}
std::map userMap//每迟发信息的索引
欲了解更多信息, 我的数据总共有12000个最新信息,并且有许多重复的字符串

比如说,, 特别是访问过的网站(最新),其中包括url。 url的平均长度约为100,80%的url是重复的

因此,我在url中保存了大约1MB的缓存内存,在应用flyweight后总共保存了5MB。

尽管Flyweight模式可能会使程序运行变慢,但我删除了低效的逻辑,例如不必要的复制和成功,以保持性能

请注意,boost flyweight图案会在对象处于活动状态时维护数据


我使用flyweight获得了有效的效果。 解决方案如下所示

#include <boost/flyweight.hpp>
structure LatestInfo
{
        flyweight<std::string> visitedWebsites;
        flyweight<std::string> watchedVideo;
        flyweight<std::string> userId;
        flyweight<std::string> userName;
        flyweight<std::string> lastLoginTime;
        flyweight<std::string> contentsRating;
        //and so on
}

std::map<unsigned int, LatestInfo> userMap;   //index per LatestInfo
#包括
后期结构
{
flyweight访问网站;
flyweight-watchedVideo;
flyweight用户标识;
flyweight用户名;
flyweight lastLoginTime;
飞锤含量测定;
//等等
}
std::map userMap//每迟发信息的索引
欲了解更多信息, 我的数据总共有12000个最新信息,并且有许多重复的字符串

比如说,, 特别是访问过的网站(最新),其中包括url。 url的平均长度约为100,80%的url是重复的

因此,我在url中保存了大约1MB的缓存内存,在应用flyweight后总共保存了5MB。

尽管Flyweight模式可能会使程序运行变慢,但我删除了低效的逻辑,例如不必要的复制和成功,以保持性能

请注意,boost flyweight图案会在对象处于活动状态时维护数据


听起来像是飞锤模式:它可能适合我的情况,我会很快应用它并分享结果。感谢yiu@Evg还有,伙计,你的想法节省了我的时间,我也得到了有效的结果:)听起来像是飞锤模式:它可能适合我的情况,我会很快应用它并分享结果。感谢yiu@Evg还有,伙计,你的想法节省了我的时间,我得到了有效的结果:)“你知道一些开源或库可以压缩它以减少分配的内存吗?”-注;要求图书馆推荐书等在这里是离题的。@Jesper Juhl。听起来是这样的。我同意。但是,如果我使用几个库或我自己的解决方案并共享分析结果,我认为这可能是一个合适的话题。Thanks@JesperJuhl我通过flyweight模式得到了一个很好的结果“你知道一些开源或库可以压缩它以减少分配的内存吗?”-注;要求图书馆推荐书等在这里是离题的。@Jesper Juhl。听起来是这样的。我同意。但是,如果我使用几个库或我自己的解决方案并共享分析结果,我认为这可能是一个合适的话题。Thanks@JesperJuhl我通过飞重模式获得了很好的效果