题目如下:
1、生成两个文件:
1)文件名Person.txt
字段:
personid,long,主键
name,string,内容随机
记录条数 1千万条
格式:txt,csv或者二进制,都可以。
2)文件名Order.txt
字段:
orderid,long,主键
personid,long,外键,内容必须在Person.txt里面,取值随机
amount,double,金额,数值随机
记录条数 1亿条,personid的模拟尽量均匀
格式:txt,csv或者二进制,都可以。
2、写程序以刚才生成的文件为依据,读取其内容,统计出等同与以下语句的一组数据,并写入文件 sqlresult.txt
1)给定一个person name ,SELECT o.amount FROM person p,order o WHERE o.personid=p. personid AND p.name=? ORDER BY o.amount limit 1000
2)SELECT p.name, sum(o.amount) sum, count(*) from person p,order o where o.personid=p. personid group by o.personid order by sum limit 1000 【选做】
Java要求:-Xmx1024m,即JVM最大内存超过1G
.NET要求在32位机器上跑。
开发要求:可以使用任何开源组件,包括单机数据库,但不允许使用SQL语句。
1、程序运行时间:
1)本机时间测试:
按名称查询:50ms左右
汇总查询:2000ms左右
2)局域网测试
按名称查询:13573ms
汇总查询:287162ms(5分钟左右,建议把文件Copy到本机)
2、文件构成:
1)存储方式
二进制,按位存储
2)文件构成(共5个文件)
person.nk: Person信息(190M), ID:long(8),Name:String(12)
person.nk.name: Person索引文件(190M), Name、PersonID
order.nk: 订单信息(2.23G), ID:long(8),PersonID:long(8),Amount:double(8)
order.nk.personid: 订单索引文件(1.48G), personID,OrderID
order.nk.amount: 订单索引文件(1.48G), PersonID,Amount
3、设计思路:
1)按照名称查询订单信息说明:
因为person有1千万条,Order有1亿条,平均每人有10个订单;
首先根据名称查询PersonID:person.nk.name,根据名称排序,二分法查找;
然后再根据PersonID查询金额:order.nk.personid,根据PersonID排序,二分法查找订单;
2)查询汇总信息:
循环订单,统计金额和数量。
直接查询order.nk文件,因为文件比较大,会花费大量的时间,所以创建PersonID和金额的索引,按PersonID排序,就可以统计出需要的结果。
源码:
test.java
1 import java.util.ArrayList; 2 import java.util.List; 3 4 public class test { 5 6 public static void main(String[] args) { 7 8 //测试名称(也可通过 PersonOperate.printPersonData(); 打印所有人员) 9 // Id:233745 Name:尉全平 10 // Id:233746 Name:汪哲宁 11 // Id:233747 Name:宦英凡 12 // Id:233748 Name:余彪朗 13 // Id:233749 Name:贾栋信 14 // Id:233750 Name:秋泽波 15 // Id:233751 Name:司栋固 16 // Id:233752 Name:黎苑芬 17 // Id:233753 Name:吉士天 18 // Id:233754 Name:轩兰兰 19 // Id:233755 Name:西冰凤 20 // Id:233756 Name:冀克新 21 // Id:233757 Name:梁韵婵 22 // Id:233758 Name:吉兰琳 23 // Id:233759 Name:齐艳纨 24 // Id:233760 Name:马枫聪 25 // Id:233761 Name:阙菊婉 26 27 28 //如有重名,默认取第一个人员,请通过 PersonOperate.getPersonsByName("东楠固") 方法确认 29 PersonOperate.printOrderByPersonName("支浩毅", 1000, true); 30 31 OrderOperate.printTop1000SumData(1000, true); 32 33 34 35 } 36 37 }