• ベストアンサー

ファイル上でB木

B木中のデータをメモリ上ではなくファイル上に展開したいのですが、何か効率のよい方法はあるでしょうか? ・1ファイルにB木のデータを保存させて一旦メモリにロードさせ、変更があればメモリ上でB木の更新をして、全データをファイルに書き出す だと効率がわるそうですし、 ・ツリー上のブロックごとに1ファイルを使う となると、ファイル数が増えそうですし。 MySQL等だとインデックスファイルは確か1ファイルになっていますよね。 B木系を扱うようなデータベースの基本的な構造をご存知の方、もしくはそのうな解説サイトをご存知の方、アドバイスをお願いします。

質問者が選んだベストアンサー

  • ベストアンサー
  • dekopa-
  • ベストアンサー率42% (161/378)
回答No.1

B+木で良いなら、ISAMの構造がそのまんまです。

参考URL:
http://www.cqpub.co.jp/try/kijidb/yougo/roku.htm
全文を見る
すると、全ての回答が全文表示されます。

その他の回答 (1)

  • Tacosan
  • ベストアンサー率23% (3656/15482)
回答No.2

「B木の 1ノード = ファイルシステムの 1ブロック」ととって, 必要な分だけ変更するのが普通かなぁと思ってみたり. そもそも, 全ノードをメモリにのせるんだったら B木の意味がないような気がする.

全文を見る
すると、全ての回答が全文表示されます。

関連するQ&A

  • [データ構造・アルゴリズム] B木について

    B木について分からないことがあるので教えて頂けたらありがたいです. 1. 平均で16個の子ノードのあるBツリーでは,100万件のデータにアクセスするとすると,最大何回のアクセスが必要になるか?また,その時に必要となる時間は何秒か?ハードディスクからのデータの転送時間は無視できるものとし,データはディスクの上にランダムに並んでいるものとする. 2. B木はメモリ上のデータへのアクセスよりは,外部記憶装置へのアクセスに適しているといわれている.その理由を簡潔に述べよ. 3. B木の1つのノードに格納できるキーの数を増やしていけば,データアクセスの効率はどうなっていくか?定性的に結果を推測せよ. 自分で考えた解答は 1. 10回 2. 探索がやりやすくなるから(よく分かりません・・・) 3. 良くなっていく(よく分かりません・・・) なのですがどうでしょうか?真剣に分からないのでアドバイスなど良かったらお願いします!

  • インデックスのアルゴリズムとBツリー

    主キーじゃないカラムにインデックスを張るとき、 つまり、値が重複することがありうる場合に 利用されるBツリーは通常のBツリーと比較して、 どのように変更すればよいものでしょうか。 また、WHERE句内で * などを使用して検索するとき、 どのようにBツリー内を検索すれば効率的でしょうか。 データベースの実装に関する質問になりますが、 わかる方、よろしくお願いします。

  • B+木 逆順に効率よく取り出すには?

    http://en.wikipedia.org/wiki/B+_tree にあるとおり,B+木のリーフ部分を昇順で連続アクセスするのは容易ですが,降順に順次アクセスしたい場合はB木のように枝を探索しながらでないと無理ですよね。 これは隣接するリーフ同士を単方向ではなく双方向リンクでつなげればよい事になりますが,そうすると保持するべきポインタが1つ増え,枝ブロックとリーフブロックサイズが変わってしまうのも何となくいい気がしません。 しかし、昇順降順でソートされた2つの木を用意する・・というのも領域の無駄遣いですし。やはり、B+木で降順でキーを順次取り出したい場合はリーフ部分に双方向リンクを持たせてやるのが普通でしょうか。

  • B木のプログラムについて

    Javaアプレットで学ぶデータ構造とアルゴリズムを勉強中です。 「B木プログラムを作ってみよう」という演習問題なのですが、簡単がプログラムを教えていただけないでしょうか。 宜しくお願いいたします。

  • ファイル/bin/catへのアクセス

    オペレーティングシステムに関する話です。 UNIXの木構造のファイルシステムにおいて、 ファイル/bin/catのデータブロックへのアクセスはファイルシステムの内部では具体的にどの様に行われるか、分かる方教えて頂けませんか?

  • ファイル構成に関する質問

    【環境】 言語はPerl 5.8。 データベースは使用できない。(汎用化の問題) 使用できるのは標準モジュールのみ。(同上) 【やりたいこと】 データベースとほぼ同一、特定のキーを元にレコードの抽出、保存。 また、一覧の作成。 ライセンスの関連もあるので、汎用化を前提に自作を検討。 【疑問点】 今回、ファイル構造について疑問に思う点があります。 OSの用意するファイル管理は一種のデータベースと見ることができ、これはほぼ全ての環境で使用できます。 複数の掲示板のソースを参照して、ほぼ全ての掲示板で一つ、もしくは複数のファイルにデータを保存してそれをメモリ展開後扱っていました。 しかし、データベースのような構造の場合、レコードごとの関連は低い用件では、レコードごとにファイルを作成しても良いのではないか? 逆に分散することにより全体が壊れる可能性の低下などのメリットがあるのではないかと考えています。 しかし、採用している掲示板が少ない事が気がかりとなり、実装に踏み込めていません。 データベースのようなファイルを複数に分割するメリット・デメリットなどあるのでしょうか?

    • ベストアンサー
    • CGI
  • MySQLのデータベースのバックアップを取り込む方法について。

    MySQLのデータベースのバックアップをphpMyAdminのエクスポートで取っていました。 そのバックアップを新しいデータベースに取り込みたいのですが、うまく行きません。 すでに、同じ名前で同じ構造の新しいデータベースは作成済みで、新しいデータも生じているのですが、phpMyAdminでバックアップしたファイルをインポートすると、古いデータは取り込めるのですが、新しいデータが消えてしまいます。 バックアップしたデータを新しいデータに追加するには、どうしたらいいでしょうか?

    • ベストアンサー
    • MySQL
  • MySQLにCSVファイルを入れる方法

    MySQLでデータベースを構築しています。CSVファイルにデータを構築していますがMySQLにインポートする方法が解りません。どうかおしえていただけませんでしょうか?

  • C言語 2分木探索について質問です

    C言語初心者です。 2分木構造体 struct node{ int data; Tree left_subtree; Tree right_subtree; } を上記のように定義した場合、 2分木の根節点のポインタ struct node *Tree を引数として与えられたとき、 2分木内の節点に保持された整数データの総和を戻り値として返す関数 int sum_data(Tree t);を再帰呼び出しで作成してみたのですが、正しいでしょうか? ■2分木内の節点に保持された整数データの総和を戻り値として返す関数 int sum_data(Tree t) {     // 左分木、右分木のどちらも存在しなければ根節点の値を返す     if ((t->left_subtree == NULL) && (t->right_subtree == NULL))      {      return t->data;    }     else// どちらか存在していれば再帰呼び出しする    {      return (t->data + sum_data(t->left_subtree) + sum_data(t->right_subtree))    } } ご指摘ありましたら、お願いしますm(_ _)m

  • MySQLで連続csvファイルを読み込むために

    MySQL 5.6を最近使い始めました。 大量のcsvファイルで保存されているデータを読み込んで、データベースとして扱いたいのですが、どうすれば良いでしょうか? ファイル名は、 data1_1.csv data1_2.csv data1_3.csv data2_1.csv data2_2.csv といった形で、規則正しく並んでいるのですが、大量にあるため、ループを使って自動化したいと思っております。そのために、LOAD DATA INFILE ファイル名 を使って、このファイル名を順次変えて繰り返す方法がわかりません。 まず、ファイル名に変数が使えるのかと思って @file="data1_1.csv"としてファイル名を置き換えてみたのですが、エラーでした。これでは、この1_1を順次動かす以前に変数が無理なのかも?と思っています。 何かやり方があるようでしたら、どなたかお教えください。 どうぞよろしくお願いいたします。

    • ベストアンサー
    • MySQL