题目:假如有一个1TB大小的文件,每行的格式如下(用Java实现):
323828328,李武,男,广州市323232332,小四,女,三藩市.....
(1)请编写一个程序(假设名字是不重复的),得到一个索引文件,并且要保证这个索引文件尽量小,可以提上搜索的效率,前提是内存只有1G的大小。
(2)请利用你的所得到的索引的文件,根据名字(假设名字是不重复的)搜索出该名字所对应的信息大家讨论一下,希望高手能贴出代码,光懂皮毛随便说说的就算了!

解决方案 »

  1.   

      首先   java 创建复合文档, 用什么信息建立, 还有就是你说的磁道信息。java如何获得??? 不如 你用伪代码写出来吧!
      

  2.   

    创建复合文档
    创建一个段
    对数据文件分块
    将每块的磁道信息写入该段
    创建一个段
    写入复合索引结构体信息
    对数据文件各块排序
    写入对每一块排序后的索引并与第一段关连
    创建一个段
    保存主键在第二段的分段索引信息和游标信息
    创建一个段
    创建一个HASH表,写入该段
    对第三个段中的索引进行分段索引
    搜索条信息
    计算该条信息的主键的HASH值
    找出该主键所在的索引段
    在所在索引段中查询出所对应的数据块
    根据该数据块的查询所对应的磁道信息
    在对应的磁道中读取数据本人是做C的,JAVA做的不多,怎样用JAVA操作磁盘还真不知道
      

  3.   

    名字转化为Unicode码-转化为,建立两棵二叉树,一棵插入名字Unicode,排序,另一棵根据前面那棵树插入1,2,3,... 
    收索时转化为Unicode,检索二叉树,找到该名字,对应另一棵二叉树,得到该名字位置
    进入文件 ,得到该信息
      

  4.   

    哈哈,不懂,但偶也要厚着脸皮瞎扯扯:1TB = 1024^4 字节
    你给出的记录格式大约每条记录在 26 个字节左右
    所以 大概 有 1024^4 / 26 = 422 8890 8761 条记录(百亿条记录了呢)。想了个烂方法:
    建立索引文件的时候,使用某个索引空间较小的hash算法,比如 32位(4个字节),如果太大(比如128位,就截取前4个字节)
    假设使用的hash算法的冲突几率是5%(100个不同的字符串,可能有5个放在同一个索引下)
    每个索引下至少得留 (1024/26)*(1+5%)= 41 条记录的空间,假设定为64则,索引文件的大小为 longlong的字节数 * 2^32*64 = 1T 呢
    每次查找记录都,先计算出32为的hash值,并将该值转换为无符号整数n(0 ~ 2^32-1),
    然后到索引文件中 64*n 处,读取64条记录的偏移量(内存中只保存64条记录的偏移量),
    再然后到数据文件中读取64次,至多第64次查询到需要的数据。误人莫怪啦,瞎扯淡滴
      

  5.   

    这不是求助,这是技术讨论!你去je上乱说一下,可以封你ID,我们要的是质量回复,乱回复不经大脑的那些就免回了。