首页 诗词 字典 板报 句子 名言 友答 励志 学校 网站地图
当前位置: 首页 > 教程频道 > .NET > .NET >

3000万个状态,该如何解决

2012-04-03 
3000万个状态现在有一个项目,需要用一个服务器保存3000万个电话号码的忙或空闲的状态,另外一台服务器监控

3000万个状态
现在有一个项目,需要用一个服务器保存3000万个电话号码的忙或空闲的状态,另外一台服务器监控这3000万个电话号码的状态,并且把状态更新及时发送到第一个服务器。假设服务器内存足够大,程序用delphi开发,用什么样的数据结构,能比较快的在这3000万个数据结构中查找到特定的一个电话号码,并且改变这个电话号码的状态,这个速度至少要达到1000次/秒。
我的初步想法是建立300-3000个hash表,每个表存放10万-1万个电话号码,这样的查找速度还算可以,但是达不到1000/秒。
各位XDJM,有没有什么高见?

[解决办法]
关于速度,可以分解一下,看一下难关在什么地方:

市话机房----> 状态服务器 <------> 查询服务器------> 处理服务器
1 2 3 4 5

可以看出,1、3、5是网络传输,应该不是影响速度的主要原因。2和4,其实就是一个查询和运算。
如果每一次每一部电话的状态改变,都要对数据库进行查询,那样速度瓶颈很难突破。
可以借鉴使用集合类型。每个集合占内存32个字节,有256个位,可以用每个位的1或0代表一部电话的忙或闲。建立集合数组,把3000万部电话分段,每256部电话的状态用一个集合表示。通过集合运算(集合运算是位运算,速度很快),快速得到这256部电话每部的状态。

关于集合的应用(之所以建议用集合或集合数组,是为了节约内存和提高速度),参考我的一篇文章:
http://community.csdn.net/Expert/TopicView.asp?id=5337219
http://community.csdn.net/Expert/topic/5337/5337219.xml?temp=.3392603
这两个链接,我不知哪个对了。

上述言论仅供参考!仅供参考!!!

[解决办法]
unit Unit1;

interface

uses
Windows, Messages, SysUtils, Variants, Classes, Graphics, Controls, Forms,
Dialogs, StdCtrls;

type

TForm1 = class(TForm)
Button1: TButton;
procedure FormCreate(Sender: TObject);
procedure FormDestroy(Sender: TObject);
procedure Button1Click(Sender: TObject);
private
FBits: TBits;
public
{ Public declarations }
end;

var
Form1: TForm1;

implementation

{$R *.dfm}

procedure TForm1.FormCreate(Sender: TObject);
begin
FBits := TBits.Create;
FBits.Size := 99999999; // 8位号码 千万级 类填充索引
end;

procedure TForm1.FormDestroy(Sender: TObject);
begin
FreeAndNil(FBits);
end;

procedure TForm1.Button1Click(Sender: TObject);
const
testCount = 1000000; //百万个测试
var
numberList: array of integer;
numberFlagList: array of boolean;
i: integer;
bt: DWORD;
begin
Randomize;
setlength(numberList, testCount);
setlength(numberFlagList, testCount);
for i := 0 to testCount - 1 do
begin
numberList[i] := Random(99999999);
end;

bt := GetTickCount;
for i := 0 to testCount - 1 do
numberFlagList[i] := FBits.Bits[numberList[i]] ;

ShowMessage(IntToStr(GetTickCount-bt));
// 百万个测试不会 超过 1秒的
end;

end.


[解决办法]
那 我们 要
区号带8位,最长11位(不包括起一个0)
基于 号码 规定 一个 好的 下标格式
[解决办法]
考虑 作一个 TBits 的 数组 按区号 划分
[解决办法]
TBits 数组??
[解决办法]
withcsharp() 的意图,可能跟我在一楼说的基本思路不谋而合。但,没有TBits这样的类型。可以参考我在一楼说的那篇文章,用集合(或集合数组)表示,用集合进行运算。
[解决办法]
-_- 对不起,我无知。 汗....
[解决办法]
直接用 下标 是最快的
因为 那是 直接定位
例如 查 8186045
FBits.Bits[8186045]

热点排行