2013-01-19 119 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

有沒有一個單一的關鍵排序?從這個問題,你可以搜索任何字段號? –

相關問題