当前位置:编程学习 > C#/ASP.NET >>

一个关于数据检索优化和数据逻辑耦合性高的问题

在一个项目中,如果需要对大量的数据(30万条记录以上)进行频繁的检索、计算等操作,为了提高系统的反应速度,在系统启动时,将数据库中的数据读取到内存中,
即将数据读取到一个个的DataTable中,系统运行过程中,尽量从这些DataTable中进行数据的检索与计算(如利用DataTable的Select 和 Compute方法)。这样似乎能
加快系统的运行速度。缺点是内存需求大。不过现在的内存便宜,这样做似乎也不可。不知道大家遇到这样的情况是怎么处理的?
大量数据频繁检索时,为了避免系统假死和反应过慢,都采用什么样的技术呢?

接着上一个问题,在进行项目开发的时候,为了方便进行单元测试,也为了方便任务分工和系统集成,一般会将功能相似的部分(若干个类)提取出来,单独创建一个类库项目,
将这些功能类封装成DLL文件,供主程序调用。大家应该也是这样做的吧?
这样,我的问题来了。在这些类库项目中,如果我需要用到那些保存在DataTable中的数据,该怎么处理?我总不能在每一个类库项目中都把数据加载一次吧。各位大侠是怎么处理这个问题的

呢?我感觉是自己没有处理好逻辑和数据分离的问题,逻辑和数据之间的耦合性太高!
对了,在载入数据的时候,我是把那些DataTable都写在同一个静态类中,比如一个叫Globle的静态类中。 --------------------编程问答-------------------- 越是优化耦合度就越高,这是不可避免的, --------------------编程问答-------------------- 其实也可以试下从数据库的性能调优。30万条记录真的不多。我们基本上倾向于保持程序的单纯性,努力调优数据库。 --------------------编程问答--------------------
引用 1 楼 stonespace 的回复:
越是优化耦合度就越高,这是不可避免的,


引用 2 楼 ki1381 的回复:
其实也可以试下从数据库的性能调优。30万条记录真的不多。我们基本上倾向于保持程序的单纯性,努力调优数据库。


感谢二位的回复!THX!
我还想确认下关于优化速度这个问题,除了我上面说的事先载入数据和ki1381说的调优数据库,是否还有其他主流的方法,目前大家一般都用什么样的方法来处理这样的问题?

--------------------编程问答-------------------- 缓存是很正常的优化方式,不想缓存就只能做数据库优化了,数据库再怎么优化也是读硬盘的,与读内存没有可比性。
单元测试可以有测试用例的吧,真实环境的测试还叫单元测试吗? --------------------编程问答--------------------
引用 4 楼 sbwwkmyd 的回复:
单元测试可以有测试用例的吧,真实环境的测试还叫单元测试吗?


将功能相似的部分(若干个类)提取出来,单独创建一个类库项目,这样各个小组之间可以尽可能独立的开发独立的测试,向其他小组提供功能接口就可以了。测试当然还是用模拟数据。

现在的问题是,各小组会用到很多公共的数据,而且数据量还很大。如果用缓存技术优化,想要做到尽可能独立就不太现实。如果把数据库作为一个公共的平台,各小组只是与数据库做数据交换,又存在性能受影响的问题。
头疼啊,不知道怎么找到一个兼顾的方案。 --------------------编程问答-------------------- 单元测试是一次性的,各单元测试之间应该是没有关联的,仅仅是一个输入与输出的简单证实过程。
你们各小组的行为应该属于功能测试了吧,如果需要防止相互干扰,各小组应该建立自己的测试数据库啊(当然可以来源于同一个备份)。
我觉得测试的时候的微小的性能问题,根本就没必要纠结。我以前用过一种单元测试方案,就是写两份程序,一份高执行效率发布版本,一份逻辑简单的测试版本,为的是确保程序的正确,不是说要求测试的效率有多高。 --------------------编程问答-------------------- 貌似这个问题也是仁者见仁智者见智,没有公认好的解决方案啊! --------------------编程问答--------------------
引用 4 楼 sbwwkmyd 的回复:
缓存是很正常的优化方式,不想缓存就只能做数据库优化了,数据库再怎么优化也是读硬盘的,与读内存没有可比性。
单元测试可以有测试用例的吧,真实环境的测试还叫单元测试吗?


“数据库再怎么优化也是读硬盘的,与读内存没有可比性。”

不太同意啊。。。其实做数据库优化的主要目的之一就是为了避免物理读,而且这个是可以实现的。现代数据库系统,包括服务器、存储、以及DB本身,都有许多机制来缓存数据从而避免直接的磁盘IO。我们系统中有一些表达到了小几千万条记录的级别,但是应用程序没做本地缓存、绝大多数时候响应时间也都在令人满意的程度上。

取到本地缓存带来的另一个潜在问题就是如何保证与服务器端数据的一致性。解决这个问题的开销未必小。


--------------------编程问答--------------------
引用 8 楼 ki1381 的回复:
“数据库再怎么优化也是读硬盘的,与读内存没有可比性。”

不太同意啊。。。其实做数据库优化的主要目的之一就是为了避免物理读,而且这个是可以实现的。现代数据库系统,包括服务器、存储、以及DB本身,都有许多机制来缓存数据从而避免直接的磁盘IO。我们系统中有一些表达到了小几千万条记录的级别,但是应用程序没做本地缓存、绝大多数时候响应时间也都在令人满意的程度上。

取到本地缓存带来的另一个潜在问题就是如何保证与服务器端数据的一致性。解决这个问题的开销未必小。

不仅仅数据库有自己的缓存,操作系统也有磁盘缓存,可以说缓存层越多,冗余越多,那么内存实际缓存量也就越少,而且这些缓存都是不稳定的,会随机数据的变化与内存的使用情况有淘汰行为。
自己缓存的效果就完全不同了,其结果是结构化的(不需要经过计算解析生成),其内存占用最少(其它层的缓存是一次性的淘汰也所谓)。
对于整表缓存的这种,一致性问题真的很简单,对于我自己而言,绝对是不需要写代码的。
几千万记录级别的,对于32位的服务器一般的缓存方法是行不通的。不知道除了索引与分表以外,你会否考虑设计或算法方面的优化?不知道令人满意到底是个什么样的程度(什么样的查询在多少ms内有响应)? --------------------编程问答--------------------
引用 9 楼 sbwwkmyd 的回复:
对于整表缓存的这种,一致性问题真的很简单,对于我自己而言,绝对是不需要写代码的。

不好意思,更正一下,需要给一个枚举赋值,还是有代码的。 --------------------编程问答-------------------- 两位说的都很有道理啊!

引用 8 楼 ki1381 的回复:
取到本地缓存带来的另一个潜在问题就是如何保证与服务器端数据的一致性。解决这个问题的开销未必小。


引用 9、10 楼 sbwwkmyd的回复:
对于整表缓存的这种,一致性问题真的很简单,对于我自己而言,绝对是不需要写代码的。
不好意思,更正一下,需要给一个枚举赋值,还是有代码的。

关于数据一致性的问题,我确实在项目中遇到了!不知道sbwwkmyd使用什么简单的方法解决的,小弟惭愧,想不到!不知道能否指点一二!谢过了! --------------------编程问答-------------------- 目前我考虑的方法是,对树等结构比价复杂的数据,在本地缓存,我觉得象 sbwwkmyd所说“结果是结构化的(不需要经过计算解析生成),其内存占用最少”,而且做好后使用起来也很方便。
在此基础上将逻辑与数据尽量的分离。实在耦合的紧密那也就没有办法了!我也不想为了降低耦合性,把代码弄得非常的绕,毕竟我的最终目的是要把项目做了! --------------------编程问答--------------------
引用 11 楼 whitebird101 的回复:
关于数据一致性的问题,我确实在项目中遇到了!不知道sbwwkmyd使用什么简单的方法解决的,小弟惭愧,想不到!不知道能否指点一二!谢过了!

如果楼主有此问题,很可能说明项目中没有合理的数据层。
如果有的话,数据的修改必然经过这里,在修改操作时 或者 监听修改,都可以方便的同步缓存。
相反,如果修改代码分散在项目中的各个角落,不仅仅是实现代价高,维护代价也很高,可以说是做不了。

程序分层分块,各司其职,对于抽象与维护来说很重要。一般来说都是一劳永逸的,是值得下功夫花时间的。 --------------------编程问答--------------------
引用 12 楼 whitebird101 的回复:
目前我考虑的方法是,对树等结构比价复杂的数据,在本地缓存,我觉得象 sbwwkmyd所说“结果是结构化的(不需要经过计算解析生成),其内存占用最少”,而且做好后使用起来也很方便。
在此基础上将逻辑与数据尽量的分离。实在耦合的紧密那也就没有办法了!我也不想为了降低耦合性,把代码弄得非常的绕,毕竟我的最终目的是要把项目做了!

如果楼主的目的仅仅是把项目做了,而且已经做了很多工作。
那么这种一次性的代码可以采取原始的方式,目的还是为了减少工作量,性能什么的应该就不用考虑了吧。
补充:.NET技术 ,  C#
CopyRight © 2022 站长资源库 编程知识问答 zzzyk.com All Rights Reserved
部分文章来自网络,