题目如下:

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 }
View Code

相关文章: