大规模数据查询
有1到10万个设备,每个设备都会在相隔一段时间后,在某个时间点产生1个7位带小数的数据,同一个设备的时间相隔点相同,不同设备的相隔的时间可能不同,每个设备都会产生1万条数据,这些数据已经保存在一个文件里面,保存格式是,前3位数,第一位表示设备号,第二位表示开始时间,第三位表示间隔时间,后面的一万位表示这个设备产生的一万个数据,以此类推,例如 1 10 10 1.111111 。。。。。。2.22222 2 10 20 1.111111 。。。。。。2.22222。。。。怎么按一个设备查询产生的所有数据,或者是某个时间点所有设备产生的数据,怎么做呀,要求速度卡,内存占用小 大数据 查询
[解决办法]
你这这么大的数据 有要求速度
一般就进行预处理
对这8G的数据 生成另外两份文件
一份按设备排序 格式是:第一位表示设备号,后面跟这个设备的所有数据
一份按时间排序 格式是:第一位时间点,后面跟这个时间点对应的所有数据
然后针对你这两个不同的需求 读不同的文件
[解决办法]
第一道问题,按照设备号查询,非常简单。题目中说,已经按照设备号排序好了,每个设备都只有10000条数据,直接用fseek,比如要你立马找出第2233个设备号的数据。直接fseek到sizeof(everyData)*10000*2232,下一条就是第2233号设备的数据,直到10000*sizeof(everyData)处.
第二道题目,按照某一个固定的时间Tn时间算,也非常简单。开始时间Ts,时间间隔Tx,于是得到sizeof(everyData)*((Tn-Ts)/Tx)这个公式,
第一号设备数据:从开始处fseek,后面这么多sizeof(everyData)*((Tn-Ts)/Tx)的数据;
第二号设备数据:从10000*sizeof(everyData)处开始fseek,后面这么多sizeof(everyData)*((Tn-Ts)/Tx)的数据;
。。。。。以此类推,非常简单,每找到一个设备的数据,直接存储到别的文件里,内存用的非常少。。
做题目不要局限于现有的架构,一定要灵活,这道题就考你偏移量的思想,非常简单!!