2013-01-19 90 views
1

这是我的数据库类中作业的问题之一。Java:将CSV文件转换为二进制文件

我不明白为什么我们需要将csv文件转换为二进制文件。我认为这样会让搜索数据变得更加困难。谁能告诉我为什么我们需要这样做?我的老师是否在欺骗我,或者将csv文件转换为二进制文件以便用二进制搜索方法进行读取真的更好。 csv文件的一行示例是

1|37|O|131251.81|1996-01-02|5-LOW|Clerk#000000951|0|nstructions sleep furiously among 

这是我的老师给我的任务。 我真的停留在任务C.

概述 这个作业的目的是帮助你了解参与查询太大,以适应在内存中的全部大型数据集的问题我。为了调查这些问题,您将编写一个Java程序,以CSV文件的形式读取数据表,并尽可能高效地在表上运行查询。程序的模板被提供,你的代码应该被添加到Assignment1.java文件中。提供了一个驱动程序Driver.java,以便您可以测试您的程序。驱动程序将包含要由程序解释和执行的命令列表的文件作为输入。您将以指导的方式实施该计划的多个版本。在所有版本中,您都必须假定数据可能不适合内存,也就是说,您将无法将所有数据读取到内存中的Java数据结构中。

在所有版本中,命令的基本顺序始于加载数据,然后是一系列相等查询或范围查询的查询。你可以假设输入是正确的并且行为良好,即,这个任务的目标不是错误处理。 任务A(15分) 在第一个版本中,您将实现最简单,最天真的解决方案。您的Java程序支持的命令列表必须包含以下内容:

naiveLoad文件名:告诉程序以下查询将用于文件名为csv的文件 naiveSearchEq columnNum value:打印表中行的值列号中的columnNum等于给定的值。列号从一开始。 naiveSearchGtr columnNum value:打印列号为columnNum的值大于给定值的表的行。

搜索命令应通过使用java类FileReader逐个字符读取CSV文件来实现。您应该阅读FileReader,InputStreamReader等的Java文档。您必须使用FileReader类。 任务B(15分) 在第二个版本中,您将通过使用缓冲IO改进第一个版本。使用BufferedReader类编写第二个版本的搜索命令。命名命令和相应的方法如下:

naiveBufSearchEq columnNum value:打印列号为columnNum的值等于给定值的表的行。列号从一开始。 naiveBufSearchGtr columnNum value:打印列号为columnNum的值大于给定值的表的行。

任务C(50分)

在第三个版本,你会采取不同的方法解决问题。您将首先加载CSV数据文件并将其转换为BINARY文件。你必须命名你的二进制文件“data.bin”。随后的查询将对二进制文件进行操作。您可以自由设计二进制文件的格式。命名命令和相应的方法如下:

binaryLoad文件名:将带有文件名的csv文件转换为二进制文件。二进制文件的文件名应该存储在你的程序中。 binarySearchEq columnNum value:打印列号为columnNum的值等于给定值的表的行。列号从一开始。 binarySearchGtr columnNum value:打印列号为columnNum的值大于给定值的表的行。

任务D(20分) 获取程序版本1,2和3的时间并比较运行时间。你应该平均至少10次运行的时间。在上laulima的在线提交,回答下列问题:

Tabulate the average running time of the three versions of your program. Compare the running times of the three versions. 
How are the timings of the different versions different? 
Why are the timings of the different versions different ? 
What did you learn in this assignment? What was most difficult/challenging (if any)? 
+0

这是没有足够的信息来明白为什么你被要求这样做。这显然是为未来的任务做准备,但是如果不知道接下来会发生什么,就不可能告诉你为什么或者提出可能的设计。另外,你应该用_some_ care来写你的问题。我这次修正了错误,但编译器不像人类那样宽容。 –

+1

老师提出任意限制使任务更加有趣/困难是相当普遍的。 –

+0

显然有一些缺失的上下文(即“二进制文件”是什么意思)。 –

回答

1

考虑到更新的目标我会做通经文件并生成键上的分类指数。该索引将包含关键值和每个记录与该关键字的偏移量。然后我会写一个由索引和原始数据组成的新文件。如果允许使用两个文件,只需将索引作为单独的文件写入磁盘即可。

该索引将比原始文件小很多。当您需要搜索时,只读取索引部分(或文件),使用二进制搜索查找关键字,从索引条目中检索偏移量,并使用该偏移量查找数据并只读取该记录。

如果即使索引太大而无法放入RAM中,也必须分两步来构建索引。

  1. 读取数据文件,并写入索引文件,* 联合国 *排序,一条记录时间
  2. 使用磁盘排序实用程序排序的指数
+0

哇,索引和偏移是一个好主意。但我如何建立起来呢?那里有任何教程?二进制搜索还是不错的吗? – VinsonG

+0

我认为在这一点上,你需要做你的功课和研究。请记住,对于二进制搜索,键必须按照正确的顺序(即排序)。 –

+0

有没有一个单一的关键排序?从这个问题,你可以搜索任何字段号? –

相关问题