渐进式动态存储分配策略
2013-09-16 11:56
176 查看
在粗糙集约简过程中的一个重要步骤,划分等价类中,需要存储等价类。
等价类的存储分配有两种策略:一次一分配和一步到位。
一次一分配的步骤是出现先一个新等价类,调用一次malloc,以Forest Covertype为例,第一遍划分时会形成581012个等价类。
这样需要调用581012次malloc,存储代价是 581012*sizeof(equivalence class) + 581012*sizeof(指针) 个字节。
一步到位的方法是一次性申请581012个等价类的大存储区域。
一次一分配会过多进行函数调用,581012或许不多,但数据增大到20亿条时就不是可以忽略的代价,而且破坏数据局部性。
好处是貌似这么做不浪费存储空间。
一步到位的好处是显而易见的,缺点也很明显,在申请前无法确定到底有几个等价类会产生,多了浪费,少了不够用。而且随着约简进行,等价类会越来越少,浪费严重。
所以这种情况下完全可以借鉴操作系统对页面存储分配的策略:一次一页面。
随便打开记事本,输入一个字母,退出保存,查看文件属性, 会发现文件大小 1 字节,占用空间为 4KB。
4KB是文件系统进行分配的基本粒度单位。
所以新的构造大型决策表约简的渐进式存储分配可以这样:
1、决定插槽的数目,4KB 为粒度进行存储分配。每4KB可以以存储 1024个 4-byte 整型。
2、每个插槽只存放页面指针,初始为NULL,不够时立即分配新插槽。
这样就达到了一种新的平衡。
等价类的存储分配有两种策略:一次一分配和一步到位。
一次一分配的步骤是出现先一个新等价类,调用一次malloc,以Forest Covertype为例,第一遍划分时会形成581012个等价类。
这样需要调用581012次malloc,存储代价是 581012*sizeof(equivalence class) + 581012*sizeof(指针) 个字节。
一步到位的方法是一次性申请581012个等价类的大存储区域。
一次一分配会过多进行函数调用,581012或许不多,但数据增大到20亿条时就不是可以忽略的代价,而且破坏数据局部性。
好处是貌似这么做不浪费存储空间。
一步到位的好处是显而易见的,缺点也很明显,在申请前无法确定到底有几个等价类会产生,多了浪费,少了不够用。而且随着约简进行,等价类会越来越少,浪费严重。
所以这种情况下完全可以借鉴操作系统对页面存储分配的策略:一次一页面。
随便打开记事本,输入一个字母,退出保存,查看文件属性, 会发现文件大小 1 字节,占用空间为 4KB。
4KB是文件系统进行分配的基本粒度单位。
所以新的构造大型决策表约简的渐进式存储分配可以这样:
1、决定插槽的数目,4KB 为粒度进行存储分配。每4KB可以以存储 1024个 4-byte 整型。
2、每个插槽只存放页面指针,初始为NULL,不够时立即分配新插槽。
这样就达到了一种新的平衡。
相关文章推荐
- 动态存储分配及深复制——人数不定的工资类
- 动态分区的分配策略
- 操作系统:存储管理动态分区分配及回收算法
- 存储管理动态分配几种策略
- 动态分配 撤销存储空间
- 用new和delete运算符进行动态分配和撤销存储空间
- 动态存储分配及深复制 —我的数组类
- C++ 动态存储空间的分配和释放 new与malloc的区别
- 动态分区的分配策略
- 存储空间动态分配
- 动态存储分配(Thinking in C++)
- C语言动态存储分配空间作为数组
- 第一部分 线性表的顺序存储(二)--动态分配
- 堆的动态存储分配之分离适配(Segregated fit)
- c++中使用new动态分配存储空间
- 函数运行时的动态存储分配
- 第十五周 项目3:(2)用new和delete运算符进行动态分配的撤销存储空间
- 动态分区的分配策略
- C里面的内存动态分配函数与存储类别
- 7.2存储分配策略