再问个貌似很深,但别人觉得可能很浅的问题!
我现在发现一个问题,我要是搞出来个冗余量很大的数据库,一个表的DBF,就占42兆,CDX,16兆。记录数100多万。这是我制定表结构的时候,没有合理安排,现在好多好多的重复记录。
我现在想依据这个表,编个小程序,把这个表中的记录,根据不重复的条件,录入到另个新表中(因为暂时不能删除现在这个表中的记录,旧表里可能有一些数据还有价值,盲目的删掉,在实际应用中,肯定不安全)
那么大家可以想像,我编的这个小程序,应该是依据一个判断是否重复的条件,然后,遍历整个表的一百多万条记录,把搜到的记录,存入新表,再将旧表中的所有与当前条件重复的,全加删除标记。
然后,再按下一个条件。。。。。。。。直到认为新表已经包括了旧表中所有的有用数据,并去掉了所有冗余。
=====================================================
到此,问题来了,我发现我的机器,在循环遍历上百万记录的时候,会很慢,遍历一千次,常常需要一个多小时。
我的是7200.9的IDE口硬盘,我分析主要问题,就是在硬盘的访问速度上!
可能是因为每次遍历表的所有记录的时候,都要从硬盘上表文件的开头,一直查到最后。这样比如查询遍历整个表一千次,就好像将这个40多兆的表文件(或再加个16兆的索引文件)读入到内存中的操作重复一千次。这肯定是很慢的,再快的机器,再快的硬盘,也就一万多转,也不可能比我的机器快多少倍。
我的问题就是-----有什么办法,把程序中用到的体积大的表,常驻内存,直到程序完成,再从内存卸下来?
因为现在都是G内存时代了,1G、2G、4G的内存,都不算希罕事了。把大体积的表调入内存,这样遍历一千次也好,遍历一万次也好,速度肯定要快过硬盘的十几倍甚至几十倍。就算是一千万条、一亿条记录的大表格,也不在话下。
但我就是不知道怎么让表常驻内存,然后,怎么样让命令或程序遍历的是内存中的表,而不是硬盘中的原始表(这个调入内存的表,不需要修改,仅是做为查询及反复遍历的根源,以取得需要数据存入新表,所以,从内存回写到硬盘的操作,可以暂时不考虑)?
以前我知道,有一类软件,是用内存模拟成磁盘,这样把表拷到“虚拟的盘”上,访问应该很快,但,这种第三方的软件,稳定性总是不太理想!!!! VFP自身,有这样的功能吗?
注:我以我现有所学,已经对程序的算法排查过了,不太可能是算法不理想的问题。再说,实际应用中,这种重复操作大体积表的情况也会有。所有,请各位高手, 把焦点集中在“如何将表调入内存”这个问题上,帮我分析解决。
谢谢!!