持续的快速的大数据量的存储及检索等问题

SHHMing 2008-06-24 11:42:49
只有60分了

持续的快速的大数据量:365 X 24 X 3600 每秒百个或以上

C---B---A

1个数据=id+描述(id是数据的唯一标识符,是一个字符串)
B不停得从A得到数据,是持续的快速的得到数据,每得到一个数据都要存储在内存中,
数据的存储要求延时尽量尽量的少,也就是说一得到就存好

C要从B中去拿数据(C知道数据的id,C要拿的是相应的描述),C 拿数据要求延时尽量尽量的少(也就说根据id马上检索出描述),C只要拿到数据,B中就删除相应的数据,B中的数据同时存在量要考虑到几万条,B中数据的增加与删除是快速时刻变化的,比如秒的时间内有百条新数据新加,有百条新数据C已拿去要删除掉

C和B是不同机器上的程序

这个B怎么设计比较好?
B是365X24X7时刻运行的,对稳定性、数据准确性、速度方面都要求很高
稳定性:程序不可以死掉
数据准确性:数据的写入最后检索出来要正确
速度:数据的写入和检索要尽量实时

请提供点意见,谢谢
...全文
503 33 打赏 收藏 转发到动态 举报
写回复
用AI写文章
33 条回复
切换为时间正序
请发表友善的回复…
发表回复
lin_style 2008-06-27
  • 打赏
  • 举报
回复
[Quote=引用 29 楼 taodm 的回复:]
引用 28 楼 lin_style 的回复:

再次善意提醒不要用STL

兄弟你还没学会接管stl的内存管理吧。
所有7*24的程序,都必须自己接管内存管理的,默认的new是不能用的,默认的stl的allocate也是不能用的。
[/Quote]

前辈,可以介绍下这方面的书籍吗?
lin_style 2008-06-27
  • 打赏
  • 举报
回复
[Quote=引用 29 楼 taodm 的回复:]
引用 28 楼 lin_style 的回复:

再次善意提醒不要用STL

兄弟你还没学会接管stl的内存管理吧。
所有7*24的程序,都必须自己接管内存管理的,默认的new是不能用的,默认的stl的allocate也是不能用的。
[/Quote]

是的。谢谢taodm指点。
taodm 2008-06-27
  • 打赏
  • 举报
回复
[Quote=引用 28 楼 lin_style 的回复:]

再次善意提醒不要用STL
[/Quote]
兄弟你还没学会接管stl的内存管理吧。
所有7*24的程序,都必须自己接管内存管理的,默认的new是不能用的,默认的stl的allocate也是不能用的。
lin_style 2008-06-27
  • 打赏
  • 举报
回复
不是,我是针对你这句话说的

所有电话时间持续一个小时,数据量就有3600×30=10万了,所以用静态的感觉有局限

这种东西用静态是最好的。动态就等着挂吧

再次善意提醒不要用STL
SHHMing 2008-06-27
  • 打赏
  • 举报
回复
你要考虑到。你是收和删并发的。。
-----------------------
是啊,我在想用个全局hash_map,再加上CCriticalSection同步
是否可以达到我的要求
否则用其它的办法,现在也不会,什么自己内存管理,也没有管过,不敢去瞎管
lin_style 2008-06-27
  • 打赏
  • 举报
回复
你要考虑到。你是收和删并发的。。
SHHMing 2008-06-27
  • 打赏
  • 举报
回复
关注!
SHHMing 2008-06-27
  • 打赏
  • 举报
回复
请问下
如何自己去接管内存管理
有相关的资料推荐吗
SHHMing 2008-06-26
  • 打赏
  • 举报
回复
如果以峰值来考虑,所有电话时间持续一个小时,数据量就有3600×30=10万了,所以用静态的感觉有局限
SHHMing 2008-06-26
  • 打赏
  • 举报
回复
如果hash_map可以满足秒级3、40条的数据的增加与删除,并且可以稳定持续的运行365天,我想用它来做就很简单
SHHMing 2008-06-26
  • 打赏
  • 举报
回复
个人认为,长期运行的程序尽量不要和stl挂钩起来。(当然个人意见,毕竟我有这方面的教训)
第二、内存不要动态分配,既然每条只有几十个字节,10万条也就10MB, 完全可以事先分配这么多空间,
当然不是100000,只要1000就好了,你可以手动维护这个队列。

为什么说只要1000?因为根据你的描述
B中数据的增加与删除是快速时刻变化的,比如秒的时间内有百条新数据新加,有百条新数据C已拿去要删除掉

这个前提是,数据来源是TCP,而且是一个端口,所以不会快到哪里去。对付百条的数据,1000个缓存已经足够了。
这样工作的中心就变成,维护这个队列,只要做最少的事,put,get,mutex,strcpy四个东西就够了。

如果需要在完善点,以上都做成进程的,再加个进程监控的东西。不要吝啬对进程的开销,
进程的控制永远比线程好得多。况且我估计楼主的机器放的也不是一般的民用机,
-----------------------------------------
数据的来源是交换机发过来的消息,也就是利用交换机的开发包函数得到

现在的峰值是每秒3、40条,我的程序就是要把这些数据在内存中存起来,以供其它的线程来检索
但是我是不知道其它的线程什么时候来检索,可能很快,立即来,也可能很慢,半小时后来,没有检索前,数据都是需要保存在内存中的

所以用静态的不可估计需要多大的容量,我现在考虑10万,但是万一超过又怎么办,所以用静态不好

我就想用动态来做,正好hash_map似乎可以符合我的要求,但是我就是担心频繁的数据的增加与删除必然会使得内存的申请和释放频繁,对稳定性顾虑很大
lin_style 2008-06-26
  • 打赏
  • 举报
回复
个人认为,长期运行的程序尽量不要和stl挂钩起来。(当然个人意见,毕竟我有这方面的教训)
第二、内存不要动态分配,既然每条只有几十个字节,10万条也就10MB, 完全可以事先分配这么多空间,
当然不是100000,只要1000就好了,你可以手动维护这个队列。

为什么说只要1000?因为根据你的描述
B中数据的增加与删除是快速时刻变化的,比如秒的时间内有百条新数据新加,有百条新数据C已拿去要删除掉

这个前提是,数据来源是TCP,而且是一个端口,所以不会快到哪里去。对付百条的数据,1000个缓存已经足够了。
这样工作的中心就变成,维护这个队列,只要做最少的事,put,get,mutex,strcpy四个东西就够了。

如果需要在完善点,以上都做成进程的,再加个进程监控的东西。不要吝啬对进程的开销,
进程的控制永远比线程好得多。况且我估计楼主的机器放的也不是一般的民用机,
SHHMing 2008-06-26
  • 打赏
  • 举报
回复
持续的快速的大数据量:

我支持taodm的说法
用专业的数据库

假设要存储的数据量大于物理内存的一半,搜起来就没什么意义了。而且还要自己去管理内存池。
如果是持续时间的话,建议不要用STL,血的经验啊,绝对撑不过三天就挂了。

LZ这次做的和我很像,我一天将近20万条数据

而且要对这块数据量进行搜索,如果还可能被其他程序引用, 建议用oracle之类的比较大的数据库
你的搜索会比oracle牛B?

总结,数据量大,搜索频繁,要长时间运行,或许还要被其他程序调用
建议存入数据库,从数据库中处理

否则。。

很累的。
---------------------------
要存储的数据量不会很大的,算10万条,每条也就几十个字节
100000X100=10M
内存有几个G呢
我想仅仅用hash_map来做,但是就是不知道是否可以符合要求,测也测不成啊,最后写成的程序要长年持续运行的

hash_map可以应付持续的频繁的数据的增加与删除吗
lin_style 2008-06-26
  • 打赏
  • 举报
回复
持续的快速的大数据量:

我支持taodm的说法
用专业的数据库

假设要存储的数据量大于物理内存的一半,搜起来就没什么意义了。而且还要自己去管理内存池。
如果是持续时间的话,建议不要用STL,血的经验啊,绝对撑不过三天就挂了。

LZ这次做的和我很像,我一天将近20万条数据

而且要对这块数据量进行搜索,如果还可能被其他程序引用, 建议用oracle之类的比较大的数据库
你的搜索会比oracle牛B?

总结,数据量大,搜索频繁,要长时间运行,或许还要被其他程序调用
建议存入数据库,从数据库中处理

否则。。

很累的。

SHHMing 2008-06-26
  • 打赏
  • 举报
回复
我试了下
vc2005 ms的hash_map

hash_map <char*, char*>
可以直接用

hash_map <CString, CString>
hash_map <string, string>
好象不可以
SHHMing 2008-06-26
  • 打赏
  • 举报
回复
如果想用hash_map(char*,char*)
是不是还要写过hash函数和比较函数
应该怎么写?
SHHMing 2008-06-26
  • 打赏
  • 举报
回复
hashmap 对数据量大的索引的检索速度是常数时间,数据量越大越体现它的优势。

内存管理:
可以通过限制hashmap::size()实现,控制元素个数可以么?
但考虑A的数要是过快,导致内存过大时,对A的数是丢掉还是等待内存有空间再插?
----------------------------------------
元素个数不定,某个时候可能很少,某个时候可能很大,几万


但考虑A的数要是过快,导致内存过大时,对A的数是丢掉还是等待内存有空间再插?
--------------------------------------------
内存应该足够,每个数据不会很大,可能就是一个id(就长度固定的一字符串)+电话号码(最长也不会太长)

同时数据的存在量,考虑到几万应该就可以了

数据的增加与删除是频繁的

用CMap不知道是否可以实现这个需求
有没有hash_map的使用例子,是在vc2005下使用ms的hash_map,看了下msdn,好象都是int int的
SHHMing 2008-06-25
  • 打赏
  • 举报
回复
1. 多级索引,加快数据的查找速度,以id为key,用hash表做为查找的系统。
b中的内存的对象设定一个统一的格式,设定一个valid位,c中拿到数据后,b不做对象删除,只把标志位清零。
--------------------------------------------------------

直接用hash_map可以实现吗,多级索引请再细说下,是在hash_map的基础上做还是?


b中的内存的对象设定一个统一的格式
一般用什么样的格式?

b不做对象删除?那删除是删除线程专门来做?



3. 是否有做预处理的可能??
没有预处理的可能
boxban 2008-06-25
  • 打赏
  • 举报
回复
mark
SHHMing 2008-06-25
  • 打赏
  • 举报
回复
C、B是不同机器上的进程,C有若干个(不多,几个),B只有一个
C去从B里面拿数据,要求通讯是可靠的,所以C和B采用TCP通讯
B通过一接口从A拿数据(这个接口已在B内,所以就不需要考虑B、A间通讯的问题)

B从A得到数据是持续的快速的大量的:365 X 24 X 3600 每秒百个或以上
1个数据=id+描述(id是数据的唯一标识符,是一个字符串)

B每得到一个数据都要存储在内存中,以供C来拿
B中对数据的存储要求延时尽量尽量的少,也就是说一得到就存好
C要从B中去拿数据(C知道数据的id,C要拿的是相应的描述),C 拿数据要求延时尽量尽量的少(也就说根据id马上检索出描述),C只要拿到数据,B中就删除相应的数据,B中的数据同时存在量要考虑到几万条,B中数据的增加与删除是快速时刻变化的,比如秒的时间内有百条新数据新加,有百条数据C已拿去要删除掉
B中对数据的存储考虑用hash_map来做
问题:
1.B中数据的增加和删除是秒级频繁的,怎么做比较好,因为每秒从A拿到百个新数据,并要求尽量实时的写,同时每秒也有很多数据C已经拿去,要删除掉,也就是说内存会频繁的申请与释放,来一个数据就加一个到hash_map中,拿走一个就删除一个这种做法应该是不行的
2.B中数据的增加与查询、删除不是在一个线程中,如何保证线程的安全性,需要程序做同步吗
3.B是C的TCPServer,B、C间的协议怎么设计好,C就是发个id过来,B就是返回个相应的描述
4.B如何管理好多个客户端,我准备用WSAAsyncSelect来做

以前没做过类似的东西,所以细节方面不太清楚,请教下各位
加载更多回复(13)

64,683

社区成员

发帖
与我相关
我的任务
社区描述
C++ 语言相关问题讨论,技术干货分享,前沿动态等
c++ 技术论坛(原bbs)
社区管理员
  • C++ 语言社区
  • encoderlee
  • paschen
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
  1. 请不要发布与C++技术无关的贴子
  2. 请不要发布与技术无关的招聘、广告的帖子
  3. 请尽可能的描述清楚你的问题,如果涉及到代码请尽可能的格式化一下

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