关于vector存储大量数据的问题。

windmed 2008-03-24 09:57:55
各位大虾,我在做一个数据采集系统的界面,采集到的数据按顺序存放到vector容器中,每次采集到的数据为128*1024 个字节,
我每次。
我的做法是:
#define BUFFER_LENGTH 128*1024

typedef vector <BYTE> T_BUFFER;
T_BUFFER t_Buffer;
BYTE ReceiveCount = 0;
//接收数据线程
unsgned long CALLBACK ReceiveFunThread()
{
while(g_KeepGoing)
{
t_Buffer.Resize(ReceiveCount + BUFFER_LENGTH); //由于下面是用指针的方式存数据,所以在这里需要自己定义vector 的空间长度。
AnsyncReadFile((BYTE*)&(t_Buffer[ReceiveCount]),BUFFER_LENGTH);// 每次读 BUFFER_LENGTH 个数据 放入t_Buffer[ReceiveCount]
//为首地址的vector中。
ReceiveCount += BUFFER_LENGTH;
}
return 0;
}

采集的数据,采样率比较高,每次读上来的数据要求在 10ms 之内能存到 vector 中,否则会造成后面的数据丢失,刚开始的时候还好,数据是可以按时存进去的,但是当数据量很大(我的采集的数据一般都很大 有的时候可以达到 几百个兆),存数据会变得很慢,而且我发现时间耗费是在
t_Buffer.Resize(ReceiveCount + BUFFER_LENGTH); 上。
请问各位达人,我该怎样优化才能让避免上面问题,有没有什么好的方法或容器 以 既存取数据速度快,且存取数据量可以达到很大。
...全文
1880 29 打赏 收藏 转发到动态 举报
写回复
用AI写文章
29 条回复
切换为时间正序
请发表友善的回复…
发表回复
jingzhongrong 2008-03-31
  • 打赏
  • 举报
回复
用个这样的怎么样
vector< vector<T> >
里面一层的vector先申请一个固定的空间,用完就在new一个vector,存到外面的vector里面
Light_X 2008-03-27
  • 打赏
  • 举报
回复
mark
windmed 2008-03-27
  • 打赏
  • 举报
回复
还是不明白 !~
up
问题没解决之前 up up !直到问题解决!
ThinkX 2008-03-27
  • 打赏
  • 举报
回复
另外如果这个过程很频繁,而且程序是要求24×7的那种过程,那么每次new byte[BUFF_LEN],对于内存会比较难控制,你可以自己写一个buffer pool,从pool中分配buff,会更好,对内存也更可控。

template <size_t BuffSIZE>
class BuffPool
{
public:
void* allocBuff();
void deallocBuff(void*);
};

对于定长buff的pool实现是很简单的,是一个时间复杂度为O(1)的算法,很划算,当然对pool得加上同步控制。
ThinkX 2008-03-27
  • 打赏
  • 举报
回复
那么释放是没有问题 的。
实际上,可以一个线程负责接收,另一个线程负责从另一端把buff摘取下来进行处理,比如合并buff或者写入磁盘等,其实就是一个FIFO的队列,用stl的queue加上一个mutex或者condition就可以了。说白了这样就变成生产者-消费者问题了。

吹雪 2008-03-26
  • 打赏
  • 举报
回复
list<vector<BYTE>>
这样速度是最快的,而且容易处理.
hxxwcc 2008-03-26
  • 打赏
  • 举报
回复
用reserve()+push_back()代替resize(),因为resize的本质是创建一个新的vector然后copy进去,size是你指定的,存在一个大量的assignment动作(必定发生)。reserve在特定情况下可以避免过于频繁的内存分配。


#include <vector>

using std::vector;

void foo()
{
vector<char> v;
while(int i=0;i<10000;++i){
v.resize(v.size()+1);//会存在10000次重新分配,再拷贝的动作,很可怕的
v[i]=1;
}
}



#include <vector>

using std::vector;

void foo()
{
int aLargeNum=10000;
vector<char> v;
v.reserve(aLargeNum);//不需要重新分配的....就算不要reserve,也不过分配18次左右,比上面的10000次好多了。。。
while(int i=0;i<10000;++i){
v.push_back(1);
}
}
windmed 2008-03-26
  • 打赏
  • 举报
回复
晕死 打错了
是 new BYTE [BUFFER_LENGTH]
windmed 2008-03-26
  • 打赏
  • 举报
回复
[Quote=引用 11 楼 ThinkX 的回复:]

std::list <byte*> buffList;


把接收来的buff串起来不就ok了。
[/Quote]

如果按 11 楼的话,我每次申请一个BUFFER 然后把指向该BUFFER的指针放入List
byte *pBuffer = new [BYTE];
buffList.pushback(pBuffer);

那我要释放Buffer的时候该怎么操作啊?
是不是:
buffList::itertor Iter = buffList.begin();
while(Iter != buffList.end())
{
delete[] *Iter;
Iter++;
}

但是检测申请的空间并没有释放啊!
j123321 2008-03-26
  • 打赏
  • 举报
回复
List存储数据的时候你可以用引用的位置来存储啊
j123321 2008-03-26
  • 打赏
  • 举报
回复
Vector的安全性高,是同步的
sanguosifang 2008-03-25
  • 打赏
  • 举报
回复
可以一开始用reserve函数保留空间.
lc2236 2008-03-25
  • 打赏
  • 举报
回复
size 是固定的 为什么要Resize呢?
windmed 2008-03-25
  • 打赏
  • 举报
回复
up
明天再来看看 !·
另外,我想在做一个线程 用来处理vector 里面的数据,每次也是处理 BUFFER_LENGTH 个字节,处理完之后 释放 BUFFER_LENGTH 长度的空间,但是vector.erase(t_Buffer.begin(),t_Buffer.begin()+BUFFER_LENGTH ) 并不能真正的释放空间,不知道该怎么做!
有谁知道怎么弄呀!
windmed 2008-03-25
  • 打赏
  • 举报
回复
空间是 随着时间的增长 而增长啊,是无限的!
List 申请的空间不是连续的, 那我用指针的方式 存储数组能行吗 ? 如下:
AnsyncReadFile((BYTE*)&(t_Buffer[ReceiveCount]),BUFFER_LENGTH);// 每次读 BUFFER_LENGTH 个数据 放入t_Buffer[ReceiveCount];

windmed 2008-03-25
  • 打赏
  • 举报
回复
11 楼 的想法有创意 HOHO
paula2008 2008-03-25
  • 打赏
  • 举报
回复
学习
windmed 2008-03-25
  • 打赏
  • 举报
回复
我如果使用List的话 , 如何读取指定位置的值啊 ? 是不是象数组一样加下标就可以了? 但我怎么编译出错啊
windmed 2008-03-25
  • 打赏
  • 举报
回复
你可以用FileMapping的方法
是什么方法?

可以讲详细点吗 ? 我是菜鸟,另外我想把数据放虚拟内存,该怎么弄?
Waiting4you 2008-03-25
  • 打赏
  • 举报
回复
象你这种空间无限的问题我觉得不如直接写文件说不定都比你的resize快。
你可以用FileMapping的方法
加载更多回复(7)

1,221

社区成员

发帖
与我相关
我的任务
社区描述
C++ Builder Windows SDK/API
社区管理员
  • Windows SDK/API社区
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

试试用AI创作助手写篇文章吧