当许多unordered_map <string,double>具有与key完全相同的字符串时,如何节省内存

约翰·史密斯

我正在使用功能进行分类。

每个功能组均为unordered_map<string, double>string是要素名称,double是要素值。

class FeatureGroup {
      private:
        unordered_map<string, double> features_ = unordered_map<string, double>{
                { "c_n_a", 0 },
                { "c_n_b", 0 },
                { "l_1_a_1mm", 0 },
                { "l_2_a_1mm", 0 },
                { "l_3_a_1mm", 0 },
                ...
            }
    }

每个实例都有一个功能组。而且,我有很多(比方说800万个)实例。

我的问题是:我想节省很多精力。可以说,我已经使用了简短的功能名称。

由于每个实例的功能名称在实验中是相同的,因此我不希望将诸如“ c_n_a”,“ c_n_b”之类的功能名称字符串存储8000000次。

我已经做了一些搜索(例如使用char *作为键类型,std :: reference_wrapper <>),但仍然感到困惑。所以,请帮忙。我应该怎么做才能不存储特征名称8000000次,从而节省内存?

PS:

我读了一些东西flyweight,没有发现它不起作用。但是,在按如下所示更改代码后,我的编程速度大大降低。

using flyweight_string = boost::flyweight<std::string>;

class FeatureGroup {
    private:
        unordered_map<flyweight_string, double> features_ = unordered_map<flyweight_string, double>{
                { flyweight_string("c_n_a"), 0 },
                { flyweight_string("c_n_b"), 0 },
                { flyweight_string("l_1_a_1mm"), 0 },
                { flyweight_string("l_2_a_1mm"), 0 },
                { flyweight_string("l_3_a_1mm"), 0 },
                { flyweight_string("l_1_b_1mm"), 0 },
                ...
        }
}

设置和获取功能时,我使用以下格式:

features_[flyweight_string(feature_name)] // feature_name is of string type

设置要素值时,我还使用以下语句来检查是否定义了要素名称。如果不是,则程序exit(1)

if(features_.find(flyweight_string(feature_name)) != features_.end())   

我的程序的结构如下。我希望有人能找到利用boost :: flyweight后变慢的原因。

在我的程序中,每个Instance(类)都有一个ID FeatureGroup,和类标签。我还有一个名为的类InstanceManager,它实际上维护了Instance(即unordered_set<Instance>的容器在我的程序中,我为所有实例(例如,一次为所有实例)计算每个功能"c_n_a",然后更新存储在容器中的相应功能值。在计算完所有特征值之后,我将获得每个实例的特征值,并使用经过训练的模型来预测类标签。

使用OpenMP为实例容器对实例的特征值进行设置和获取。

在Windows性能监视器中,在更改为之前boost::flyweight<std::string>,所有CPU内核的利用率都接近100%。改变举重后,银联的利用率下降到6〜7%。毕竟,我的程序变得非常慢。

我不知道为什么由于从string的更改,并行化无法正常工作flyweight_string而且,如何解决呢?

马丁·邦纳(Martin Bonner)支持莫妮卡(Monica)

看起来您有能力将功能名称硬编码到源代码中。如果是这样,则根本不应该使用字符串-而是使用一个枚举:

enum class FeatureName { c_n_a, c_n_b, l_1_a_1mm, l_2_a_1mm, l_3_a_1mm, ... };

class FeatureGroup {
      private:
        std::unordered_map<FeatureName, double> features_ =
            std::unordered_map<FeatureName, double> {
                { FeatureName::c_n_a, 0 },
                { FeatureName::c_n_b, 0 },
                { FeatureName::l_1_a_1mm, 0 },
                { FeatureName::l_2_a_1mm, 0 },
                { FeatureName::l_3_a_1mm, 0 },
                ...
            }
    }

您可能需要在FeatureName和字符串之间进行转换的函数有很多有关如何执行此操作的示例。请注意,枚举数的长度对程序的内存使用量没有影响,因此可以负担得起,只要您需要它们就可以轻松阅读。

本文收集自互联网,转载请注明来源。

如有侵权,请联系[email protected] 删除。

编辑于
0

我来说两句

0条评论
登录后参与评论

相关文章

来自分类Dev

将图形表示为unordered_map <string,vector <string >>时,拓扑排序错误

来自分类Dev

使用unordered_map时的内存分配

来自分类Dev

C ++内存泄漏与unordered_map

来自分类Dev

std :: unordered_map不释放内存

来自分类Dev

C ++-结构的unordered_map内存问题

来自分类Dev

相同键的unordered_map迭代顺序

来自分类Dev

g ++ unordered_map没有at()函数?

来自分类Dev

如何对unordered_map进行哈希处理?

来自分类Dev

如何优化unordered_map查找?

来自分类Dev

unordered_map如何运作/优化设计?

来自分类Dev

如何优化unordered_map查找?

来自分类Dev

假定所有的T的sizeof(std :: unordered_map <std :: string,T>)都是相同的,实际上是安全的吗?

来自分类Dev

std :: unordered_map <std :: String,myClass *>-std :: unordered_map :: erase()是否调用myClass的DTor?

来自分类Dev

C ++中的unordered_map :: emplace和unordered_map :: ins有什么区别?

来自分类Dev

在managed_shared_memory中具有字符串的unordered_map失败

来自分类Dev

unordered_map和具有值语义的指针

来自分类Dev

C ++ unordered_map防止为字符串键重新分配内存

来自分类Dev

C ++ unordered_map防止为字符串键重新分配内存

来自分类Dev

插入新密钥时,保持unordered_map的顺序

来自分类Dev

使用unordered_map但未映射时链接器错误?

来自分类Dev

在unordered_map Boost中插入模板值时出错

来自分类Dev

带有char *作为键的C ++ unordered_map

来自分类Dev

创建带有任何参数的std :: functions的unordered_map?

来自分类Dev

Unordered_map 在访问元素时有奇怪的行为

来自分类Dev

C ++ STL unordered_map如何解决冲突?

来自分类Dev

如何在cython中使用unordered_map?

来自分类Dev

如何初始化unordered_map <vector <int>>?

来自分类Dev

std :: unordered_map如何处理冲突?

来自分类Dev

如何使用固定数组和整数的unordered_map?

Related 相关文章

  1. 1

    将图形表示为unordered_map <string,vector <string >>时,拓扑排序错误

  2. 2

    使用unordered_map时的内存分配

  3. 3

    C ++内存泄漏与unordered_map

  4. 4

    std :: unordered_map不释放内存

  5. 5

    C ++-结构的unordered_map内存问题

  6. 6

    相同键的unordered_map迭代顺序

  7. 7

    g ++ unordered_map没有at()函数?

  8. 8

    如何对unordered_map进行哈希处理?

  9. 9

    如何优化unordered_map查找?

  10. 10

    unordered_map如何运作/优化设计?

  11. 11

    如何优化unordered_map查找?

  12. 12

    假定所有的T的sizeof(std :: unordered_map <std :: string,T>)都是相同的,实际上是安全的吗?

  13. 13

    std :: unordered_map <std :: String,myClass *>-std :: unordered_map :: erase()是否调用myClass的DTor?

  14. 14

    C ++中的unordered_map :: emplace和unordered_map :: ins有什么区别?

  15. 15

    在managed_shared_memory中具有字符串的unordered_map失败

  16. 16

    unordered_map和具有值语义的指针

  17. 17

    C ++ unordered_map防止为字符串键重新分配内存

  18. 18

    C ++ unordered_map防止为字符串键重新分配内存

  19. 19

    插入新密钥时,保持unordered_map的顺序

  20. 20

    使用unordered_map但未映射时链接器错误?

  21. 21

    在unordered_map Boost中插入模板值时出错

  22. 22

    带有char *作为键的C ++ unordered_map

  23. 23

    创建带有任何参数的std :: functions的unordered_map?

  24. 24

    Unordered_map 在访问元素时有奇怪的行为

  25. 25

    C ++ STL unordered_map如何解决冲突?

  26. 26

    如何在cython中使用unordered_map?

  27. 27

    如何初始化unordered_map <vector <int>>?

  28. 28

    std :: unordered_map如何处理冲突?

  29. 29

    如何使用固定数组和整数的unordered_map?

热门标签

归档