1

这是我在数据库课程中作业的问题之一。

我不明白为什么我们需要将 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,以便您可以测试您的程序。驱动程序将包含要由程序解释和执行的命令列表的文件作为输入。您将以引导的方式实施该程序的多个版本。在所有版本中,您必须假设数据可能不适合内存,即

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

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

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

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

任务 C(50 分)

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

binaryLoad 文件名:将带有文件名的 csv 文件转换为二进制文件。二进制文件的文件名应该存储在您的程序中。binarySearchEq columnNum 值:打印表中列号 columnNum 中的值等于给定值的行。列号从一开始。binarySearchGtr columnNum 值:打印表中列号 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)?
4

1 回答 1

1

鉴于更新的目标,我将通过文件并在键上构建排序索引。索引将包含键值和具有该键的每条记录的偏移量。然后我会编写一个新文件,该文件由索引和原始数据组成。如果允许使用两个文件,只需将索引作为单独的文件写入磁盘。

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

如果索引太大而无法放入 RAM,那么您必须分两步构建它。

  1. 读取数据文件写入索引文件,* un *sorted,一次一条记录
  2. 使用磁盘排序实用程序对索引进行排序
于 2013-01-19T08:44:08.727 回答