newasp home
用户管理  |  用户注册
首 页 ┆ 文章中心 ┆ 下载中心 ┆ 图片中心 ┆ 博客中心 ┆ 社区论坛 ┆ 客户留言
  • 站点首页
  • 电脑网络技术
  • 图形图像技术
  • 网络应用
  • 多媒体技术
  • 电脑入门初步
  • 网络推广技术
  • 数据库设计
  • Linux技术
  • 网络动态
用户名: 密码:
当前位置:PC我爱社区 → 文章中心 → 数据库设计 → 文章内容

基于内存快速查询的解决方案

减小字体 增大字体 作者:网络  来源:转载  发布时间:2008-8-31 21:02:22

COOCO视频会议实现沟通创造价值!  网站建设--像素科技全面推出,各种语言任你选择
文红论文网提供各类论文发表和翻译 影视制作、广告摄影、3D制作、企业形象策划



//都正确返回院校名称
retstr.Append(zyxx[0].ToString() + stryxs[yxdh, 0].Trim() + " ");
/**////***************************************************
///***************************************************
/// 下边的进程延迟语句发布时一定要去掉。在测试Ajax刷新效果时使用
///***************************************************
//////***************************************************
//System.Threading.Thread.Sleep(1000);//延迟??毫秒再返回
//开始翻译专业
for (int i = 1; i < 7; i++)
{//翻译专业:

//首先判断是否为空
if (zyxx[i].ToString().Trim() != string.Empty)
{
//首先生成keys
/**////追加的hash表格式为 keys 专业名称
///其中keys 为 YXBM+ZYBM+kldm+pc
string key = zyxx[0].ToString().Trim() + zyxx[i].ToString().Trim() + zyxx[16].ToString().Trim() + zyxx[10].ToString().Trim();
if (htzys.Contains(key))
{
retstr.Append(zyxx[i].ToString() + htzys[key].ToString().Trim() + " ");
}
else
{//如果专业找不到
retstr.Append(zyxx[i].ToString().Trim() + "(无此专业)" + " ");
}
}
else
{//此处else分支为只要有空白不再向下翻译//已经修改为空白也继续翻译,但是需要注意如果后边还有数据才翻译,如果后边的都为空则不再翻译
//if (zyxx[7].ToString() == "1")
//{ retstr.Append("服从分配"); }
//else { retstr.Append("不服从分配"); }
//return retstr.ToString();
bool transflag = false;
for (int j = i; j < 7; j++)//判断该空位专业后边是否还有专业,有则翻译为空白专业,没有则本条为最后一条空白专业,不需要翻译
{
if (zyxx[j].ToString().Trim() != string.Empty)
{
transflag = true;
}
}
if (transflag)
{ retstr.Append(zyxx[i].ToString() + "空白专业" + " "); }
}
}
//最后附加是否服从分配
if (zyxx[7].ToString() == "1")
{ retstr.Append("服从专业调剂"); }
else { retstr.Append("不服从专业调剂"); }
return retstr.ToString();
}
else
{
retstr.Append("无此院校,必须是招生计划中的正确院校编号!");
return retstr.ToString();
}
// return retstr.ToString();
}

/**////


/// 测试当前系统缓存是否存在
///
///
private static bool testcache()
{
//仅仅是测试了一个表是否存在而已,要有都有,要没都没,这里没有用try因为每次查询try系统消耗太大。而且如果表不存在,静态方法也就不存在了。
if (htzys.Count > 0)
{ return true;}
else { return false; }
}

//从学院字符串数组中取值,调试用
public static string getyxs(int i)
{
return stryxs[i, 0] + stryxs[i, 1];
}

/**////
/// 翻译地市代码
/// 传入字符串代码 返回结果
///
///
///
public static string transdsdm(string key)
{
if (htdishi.Contains(key))
{
return htdishi[key].ToString().Trim();
}
else
{//如果专业找不到
return "地市代码错误!";
}
}

/**////
/// 翻译县区代码
/// 传入字符串代码 返回结果
///
///
///
public static string transxqdm(string key)
{
if (htxq.Contains(key))
{
return htxq[key].ToString().Trim();
}
else
{//如果专业找不到
return "县区代码错误!";
}
}

/**////
/// 翻译报名点代码
/// 传入字符串代码 返回结果
///
///
///
public static string transbmddm(string key)
{
if (htbmd.Contains(key))
{
return htbmd[key].ToString().Trim();
}
else
{//如果专业找不到
return "报名点代码错误!";
}
}

/**////
/// 翻译院校代码
/// 传入字符串代码 返回结果
///
///
///
///public static string transyxdh(string key,string ksh,string pc)
public static string transyxdh(string hanyi)
{
/**////现在不再翻译,直接取出含义字段中的翻译
///过来的含义字段有2种格式,
///正确的10094河北师范大学
///错误的,无此院校,或报考。。。错
string[] words=hanyi.Split(new char[]{' '});
if (words.Length >0)
{
//还需要判断前4个字符是否是汉字。因为有可能只填写了学校。
string temp = words[0].ToString().Trim();
if(IsNumeric(temp.Substring(0,4)))
{
return temp.Substring(4, temp.Length - 4);
}
return words[0].ToString().Trim();
}
else
{
return "院校代码格式未知!";
}
}

/**////
/// 判断是否是数字
///
///
///
private static bool IsNumeric(string str)
{
return Regex.IsMatch(str, @"^-?\d+(\.\d)?$");
}

/**////
/// 将院校表输出测试用
///

public static string test()
{
StringBuilder strs = new StringBuilder();
for (int i = 0; i < 3200; i++)
{
string temp="";
try
{
temp = stryxs[i, 3].Trim();
}
catch
{ }
if (temp.Length != 2)
{
strs.Append(temp + "
");
}
}
return strs.ToString();

}
}

调用方式说明:传入的为一个ARRAYLIST 00001,01,02。。。。

string zhiyuanhanyi = cache.tranzhiyuan(zyxx);//翻译志愿含义,并放在控件中显示
tbxxdm.Text = zyxx[0].ToString();
tbzy1.Text = zyxx[1].ToString();
tbzy2.Text = zyxx[2].ToString();
tbzy3.Text = zyxx[3].ToString();
tbzy4.Text = zyxx[4].ToString();
tbzy5.Text = zyxx[5].ToString();
tbzy6.Text = zyxx[6].ToString();

终于完了,能够看到这里的都是高手(没有耐心成不了高手)。其实给出这么长的代码段并没有必要,但是如果修改太多又需要时间太多,而且其中有一个修改的地方能够很好的诠释一些不在计划中的意外的处理。所以就直接搬上来了。

原理很简单,实现也不麻烦。

实际效果很好,能够实现每秒百万次级别的查询。而且仅仅加载时访问数据库。我想这可能是这种特殊环境下的最高效率了。

原因很简单:

第一、翻译院校名称根本就没有查找过程,直接下标访问的。

第二、翻译专业名称时哈希表的算法复杂度与直接下标访问差不多(多一次计算hash值)

希望有人能够告诉我有没有更好更快得方法。我很感兴趣。

我这里有负载评测本方法与数据库查询方法比较的测试数据(不使用存储过程的未经优化的数据库同样查询每秒300-1000次,性能保守快2个数量级以上。),改天整理一下再放上来。

反思:

1、 实现的缺陷,静态方法支持多线程吗?我不大好说,但是负载测试时确实4个cpu都跑起来了。盼望高人指点。

2、 该方法占用内存。我们加载了全部3万条记录后,大概占用60m左右内存。当然对于现在我们动辄4g以上的内存不算什么。

3、 不支持sql标准查询。

4、 如果海量数据,内存盛不下如何操作?还有如何支持数据更新?我目前没事的时候在研究这个。希望在用户和数据库中增加一个中间层作缓冲,从而进一步提高数据库吞吐量。作为高考数据量可能没有这个必要,但是对性能的需求是无止境的。

5、 该方法使用起来可靠吗?实际使用时没有出现问题,不知道有没有高手指出可靠性的缺陷。

6、有没有人能够比较与.net新增的缓存的比较。

上一页  [1] [2] 

[] [返回上一页] [打 印]
  • ·上一篇文章:关于Visual Studio 2008的常见问题
  • ·下一篇文章:构建基于Web/XML的信息集成研究

文章评论评论内容只代表网友观点,与本站立场无关!

用户名: ! 查看更多评论

分 值:100分 85分 70分 55分 40分 25分 10分 0分

内 容: !

         (注“!”为必填内容。) 验证码: 验证码,看不清楚?请点击刷新验证码

频道栏目导航

  • 电脑网络技术
  • 图形图像技术
  • 网络应用
  • 多媒体技术
  • 电脑入门初步
  • 网络推广技术
  • 数据库设计
  • Linux技术
  • 网络动态
  • 更多分类

本类热门阅览

  • · Windows下如何用vc直接编译连接DDK...
  • · 如何为Vista/Win2008中的IIS7添加P...
  • · sql 2000与sql 2005相互转移的问题...
  • · 如何建立SQL Server 2005数据库邮件...
  • · C# 怎样实现远程连接SQL Server200...
  • · VS 2008和老的VS 2005附件包的兼容...
  • · 黑客编程:Delphi写QQ聊天记录器演示...
  • · SQL Server2005数据库连接中常见问...
  • · Sql server 2005密码安全追踪与存储...
  • · SQL 2005 XML最佳实施策略用法
  • · SQL Server2005高可用性方面的不足...
  • · 在SQL Server 2005中解决死锁问题

相关文章

  • ·基于内存快速查询的解决方案
关于本站 - 网站帮助 - 广告合作 - 下载声明 - 友情连接 - 网站地图 - 管理登陆
网站备案号:沪ICP备06047794号
本站的各类网络聊天工具,系统工具,媒体工具,绿色软件如有侵犯你的版权,请指出,本站将立即改正。
建议您使用1024*768分辨率浏览下载本站的免费软件(绿色软件)资源
软件站版权所有:PC我爱社区 站长:子昀 点击这里和我联系