分配大块内存与list列表buffer关联的思考
2013-07-21 07:51
337 查看
在wince下某软件工程中的数据流动流程大致如下,从采集到的数据,然后组包、滤波、已滤波包-->(分发)
1. 显示缓存、显示
2. 存储包、存储
3. 网络包、上传
4. 截屏
实际上要复杂些,这里只列举了主要的功能,工程中存在一个值得思考的问题,就是数据来回memory copy很频繁,IO开支不小。
因此希望分配一大块内存,它与list结构中的buffer关联,用队列方式来循环存储数据,不再过多的用memcpy,也可避免lock/unlock
主要测试代码实现如下:
二维数据内存分配:
char **darray_new(int row, int col, int size)
{
char **arr;
arr = (char **) malloc(sizeof(char *) * row + size * row * col);
TRACE(L"len = %d\n", sizeof(char *) * row + size * row * col);
if (arr != NULL)
{
char *head;
head = ((char *)arr + sizeof(char *) * row);
memset(arr, 0, sizeof(char *) * row + size * row * col);
while (row--){
arr[row] = head + size * row * col;
}
}
return arr;
}
void darray_free(char **arr)
{
if (arr != NULL)
free(arr);
}
#define ARRAY_ROW 5
#define ARRAY_COL 8 //与list个数相关
#define ARRAY_SIZE 4
struct ecgPack{
DWORD timestamp;
char **bufData;
};
list<ecgPack *> g_list;
char **g_arrayMem;
由于行业的特点,考虑到显示问题,ARRAY_ROW基本不变,实际应用中变化的是组包的个数list(用ARRAY_COL表示)
调用测试:
//包初始化
for(int i=0; i<ARRAY_COL; i++){
ecgPack *p = new ecgPack;
p->bufData = new char *[ARRAY_ROW];
g_list.push_back(p);
}
//内存分配
g_arrayMem = darray_new(ARRAY_ROW, ARRAY_COL, ARRAY_SIZE);
int j=0;
char c = 0x0A;
list<ecgPack *>::iterator itr = g_list.begin();
while(itr!=g_list.end()){
ecgPack *p = (*itr);
for(int i=0; i<ARRAY_ROW; i++){
p->bufData[i] = &g_arrayMem[i][0+ARRAY_SIZE*j]; //buffer之间的关联
p->bufData[i][0] = c; //测试数据
}
itr++;
j++;
c++;
}
//效果图,每一行代表的是波形显示数据,显示时只需要用知道当前数据移动的指针位置就可以, 避免数据在各个模块之间的流动,而是让各个模块在list中获取数据即可.
以上只是一个应用的初步想法,仅供参考
1. 显示缓存、显示
2. 存储包、存储
3. 网络包、上传
4. 截屏
实际上要复杂些,这里只列举了主要的功能,工程中存在一个值得思考的问题,就是数据来回memory copy很频繁,IO开支不小。
因此希望分配一大块内存,它与list结构中的buffer关联,用队列方式来循环存储数据,不再过多的用memcpy,也可避免lock/unlock
主要测试代码实现如下:
二维数据内存分配:
char **darray_new(int row, int col, int size)
{
char **arr;
arr = (char **) malloc(sizeof(char *) * row + size * row * col);
TRACE(L"len = %d\n", sizeof(char *) * row + size * row * col);
if (arr != NULL)
{
char *head;
head = ((char *)arr + sizeof(char *) * row);
memset(arr, 0, sizeof(char *) * row + size * row * col);
while (row--){
arr[row] = head + size * row * col;
}
}
return arr;
}
void darray_free(char **arr)
{
if (arr != NULL)
free(arr);
}
#define ARRAY_ROW 5
#define ARRAY_COL 8 //与list个数相关
#define ARRAY_SIZE 4
struct ecgPack{
DWORD timestamp;
char **bufData;
};
list<ecgPack *> g_list;
char **g_arrayMem;
由于行业的特点,考虑到显示问题,ARRAY_ROW基本不变,实际应用中变化的是组包的个数list(用ARRAY_COL表示)
调用测试:
//包初始化
for(int i=0; i<ARRAY_COL; i++){
ecgPack *p = new ecgPack;
p->bufData = new char *[ARRAY_ROW];
g_list.push_back(p);
}
//内存分配
g_arrayMem = darray_new(ARRAY_ROW, ARRAY_COL, ARRAY_SIZE);
int j=0;
char c = 0x0A;
list<ecgPack *>::iterator itr = g_list.begin();
while(itr!=g_list.end()){
ecgPack *p = (*itr);
for(int i=0; i<ARRAY_ROW; i++){
p->bufData[i] = &g_arrayMem[i][0+ARRAY_SIZE*j]; //buffer之间的关联
p->bufData[i][0] = c; //测试数据
}
itr++;
j++;
c++;
}
//效果图,每一行代表的是波形显示数据,显示时只需要用知道当前数据移动的指针位置就可以, 避免数据在各个模块之间的流动,而是让各个模块在list中获取数据即可.
以上只是一个应用的初步想法,仅供参考
相关文章推荐
- 原来可以在构造函数列表中分配内存
- 使用 Lookaside List 分配内存
- c++中函数中变量内存分配以及返回指针、引用类型的思考
- 第84讲:Scala中List和ListBuffer设计实现思考学习笔记
- libCURL动态分配buffer——节约内存
- [2014-03-20 14:00:06] [EP000000] [执行数据库查询时发生错误]ORA-04031: 无法分配 8196 字节的共享内存 ("large pool","unknown object","hash-join subh","QERHJ list array")
- 对java中的成员变量内存分配的思考
- MySQL innodb_buffer_pool 内存分配过程
- Scala中List和ListBuffer设计实现思考
- didMoveToSuperview - UITableVIew重刷新列表,内存分配问题
- Python3基础 list del 从内存中删除整个列表
- 使用 Lookaside List 分配内存
- c++中函数中变量内存分配以及返回指针、引用类型的思考
- vector,list,deque等内存分配及各方面的注意事项
- 王家林亲授《DT大数据梦工厂》第84讲:Scala中List和ListBuffer设计实现思考
- Scala深入浅出实战经典《第84讲:Scala中List和ListBuffer设计实现思考》笔记
- libCURL动态分配buffer——节约内存
- 关于heap内存分配问题追踪以及对引发coredump原因的思考
- list对象作为类的私有成员时分配内存
- 内存分配和EatMemory的思考