1

これは、データベース クラスの宿題の問題の 1 つです。

csv ファイルをバイナリ ファイルに変換する必要がある理由がわかりません。そうすることで、データを検索するのが難しくなると思います。なぜそれをする必要があるのか​​、誰か教えてもらえますか? 私の先生は私をだましているのですか、それとも二分探索法で読むためにcsvファイルをバイナリファイルに変換する方が本当に良いのですか?csv ファイルの 1 行の例は次のとおりです。

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

これは私の先生が私に与えた課題です。そして、私は本当にタスクCで立ち往生しています.

概要 この課題の目的は、大きすぎて全体がメモリに収まらない大規模なデータ セットのクエリに関連する問題を理解できるようにすることです。これらの問題を調査するには、CSV ファイルの形式でデータのテーブルを読み取り、可能な限り効率的にテーブルに対してクエリを実行する Java プログラムを作成します。プログラムのテンプレートが提供され、コードを Assignment1.java ファイルに追加する必要があります。プログラムをテストできるように、ドライバ プログラム Driver.java が提供されています。ドライバ プログラムは、プログラムによって解釈および実行されるコマンドのリストを含むファイルを入力として受け取ります。ガイド付きの方法で、プログラムのいくつかのバージョンを実装します。すべてのバージョンで、データがメモリに収まらない可能性があると想定する必要があります。

すべてのバージョンで、コマンドの基本シーケンスはデータのロードから始まり、その後に等値クエリまたは範囲クエリの一連のクエリが続きます。入力が正しく、行儀がよい、つまり、この代入の目的はエラー処理ではないと仮定することができます。タスク A (15 点) 最初のバージョンでは、最も単純で単純なソリューションを実装します。Java プログラムでサポートされているコマンドのリストには、次のものが含まれている必要があります。

naiveLoad filename : 次のクエリがファイル名 naiveSearchEq columnNum value: の csv ファイルに対するものであることをプログラムに伝えます: 列番号 columnNum の値が指定された値と等しいテーブルの行を出力します。列番号は 1 から始まります。naiveSearchGtr columnNum 値: 列番号 columnNum の値が指定された値より大きいテーブルの行を出力します。

検索コマンドは、Java クラス FileReader を使用して CSV ファイルを 1 文字ずつ読み取ることによって実装する必要があります。FileReader、InputStreamReader などの Java ドキュメントを読む必要があります。FileReader クラスを使用する必要があります。タスク B (15 点) 2 番目のバージョンでは、バッファリングされた IO を使用して最初のバージョンを改善します。BufferedReader クラスを使用して、検索コマンドの 2 番目のバージョンを記述します。コマンドと対応するメソッドに次のように名前を付けます。

naiveBufSearchEq columnNum 値: 列番号 columnNum の値が指定された値と等しいテーブルの行を出力します。列番号は 1 から始まります。naiveBufSearchGtr columnNum 値: 列番号 columnNum の値が指定された値より大きいテーブルの行を出力します。

タスクC(50点)

3 番目のバージョンでは、問題に対して別のアプローチをとります。最初に CSV データ ファイルを読み込み、BINARY ファイルに変換します。バイナリ ファイルに「data.bin」という名前を付ける必要があります。その後のクエリは、バイナリ ファイルに対して実行されます。バイナリ ファイルの形式は自由に設計できます。コマンドと対応するメソッドに次のように名前を付けます。

binaryLoad filename : filename を含む csv ファイルをバイナリ ファイルに変換します。バイナリ ファイルのファイル名は、プログラムに保存する必要があります。binarySearchEq columnNum value: 列番号 columnNum の値が指定された値と等しいテーブルの行を出力します。列番号は 1 から始まります。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

更新された目的を前提として、ファイルをパススルーし、キーにソートされたインデックスを作成します。インデックスには、キー値と、そのキーを持つ各レコードのオフセットが含まれます。次に、インデックスとそれに続く元のデータで構成される新しいファイルを作成します。2つのファイルの使用が許可されている場合は、インデックスを個別のファイルとしてディスクに書き込むだけです。

インデックスは元のファイルよりもはるかに小さくなります。検索する必要がある場合は、インデックス部分(またはファイル)のみを読み取り、バイナリ検索を使用してキーを検索し、インデックスエントリからオフセットを取得し、そのオフセットを使用してデータを検索し、そのレコードのみを読み取ります。

インデックスでさえRAMに収まらないほど大きい場合は、2つのステップで作成する必要があります。

  1. データファイルを読み取り、インデックスファイルを書き込みます。* un *sorted、一度に1レコード
  2. ディスクソートユーティリティを使用してインデックスをソートします
于 2013-01-19T08:44:08.727 に答える