java 読み込み フラット ファイル データベースは良いですか?




データベース 画像 格納 java (9)

フラットファイルデータベースのメリットについての情報のあるオプション。 私は、フラットファイルデータベーススキームを使用してカスタムブログのデータを管理することを検討しています。 これは、Linux OSの変種にデプロイされ、Javaで記述されます。

記事とコメントの両方の読み書きのパフォーマンスに関する否定的な点や肯定的な点は何ですか?

スラッシュドットを取得するのであれば、RDBMSではなくフラットファイルなので、記事の検索には間に合わないでしょうか? (願いが叶う)

私はRDBMSを使用することに反対しているだけでなく、コミュニティにそのようなソフトウェアアーキテクチャスキームの実行可能性に関する意見を聞くだけです。

フォローアップ:この質問の場合、「フラットファイル==ファイルシステムベース」と表示されます。たとえば、各ブログエントリとそれに付随するメタデータは単一ファイルになります。 ファイルフォルダ(blogs \ testblog2 \ 2008 \ 12 \ 01)の日付構造によって編成された多数のファイルの作成== 2008/12/01


フラットファイルデータベースは、その場所を持ち、適切なドメインでは実用的です。

過去のメールサーバーとNNTPサーバーは、本当にこれらのことを実際にどれくらいまで行うことができるか(実際には非常に遠いファイルシステムは何百万ものファイルとディレクトリを持つ可能性があります)の限界を押し出しました。

フラットファイルDBの2つの最大の弱点は、索引付けとアトミック更新ですが、ドメインが適切な場合は問題ではない可能性があります。

しかし、たとえば、適切なロックを設定すれば、少なくともUnix上では、基本的なファイルシステムコマンドを使って「アトミック」なインデックス更新を行うことができます。

単純なケースでは、インデックス作成プロセスがデータを実行して、新しいインデックスファイルを一時的な名前で作成しています。 そして、完了したら、古いファイルを新しいファイルに置き換えます(システムコールrename(2)またはシェルmvコマンド)。 Renameとmvは、Unixシステム上のアトミックな操作です(つまり、動作しているか動作していないか、「状態間に」が存在しません)。

新しいエントリを作成するのと同じです。 基本的には、ファイルを完全に一時ファイルに書き込んだ後、名前を変更したり、最後の場所に移動したりしてください。 次に、 "DB"には "中間"ファイルがありません。 それ以外の場合は、競合状態(書き込み中のファイルを読み取っているプロセスなど、書き込みプロセスが完了する前に終了する可能性があります。醜い競合状態)があります。

プライマリインデックスがディレクトリ名とうまく機能する場合は、正常に動作します。 たとえば、新しいファイルを見つけるためのディレクトリやサブディレクトリを作成するために、ハッシュスキームを使用できます。

ファイル名とディレクトリ構造を使用してファイルを見つけることは、今日のほとんどのファイルシステムがそのディレクトリを索引付けするため、非常に高速です。

ディレクトリに100万個のファイルを置いている場合は、調べたいチューニングの問題があるかもしれませんが、その中からほとんどのものが10万を処理します。 ディレクトリをスキャンする必要がある場合は、スキャンするファイルがたくさんあることを覚えておいてください。 ディレクトリによるパーティショニングは、それを防ぐのに役立ちます。

しかし、それはすべてあなたの索引付けと検索技術に依存します。

効果的には、静的コンテンツを提供するシェルフ・ウェブ・サーバーからのストックは、大きなフラット・ファイル・データベースであり、そのモデルはかなり良好に機能します。

最後に、無償のUnixファイルシステムレベルのツールがありますが、すべてのファイルに問題があります(grepを1000000回フォークすると、ファイル内の何かがパフォーマンス上のトレードオフになることがわかります)アップ)。

すべてのファイルが同じファイルシステム上にある場合、ハードリンクは同じファイルを別の場所(基本的にはインデックス用)に置くという点でオプションを提供します(アトミックであるため)。

たとえば、 "today"ディレクトリ、 "yesterday"ディレクトリ、 "java"ディレクトリ、実際のメッセージディレクトリを持つことができます。

したがって、投稿は "today"ディレクトリの "java"ディレクトリにリンクすることができます(投稿には "java"というタグが付いているため)、そして最後の場所(/ articles / 2008/12/01 / my_java_post 。TXT)。 その後、深夜に2つのプロセスを実行します。 最初のファイルは "today"ディレクトリ内のすべてのファイルを取り込み、作成日をチェックして "今日"でないことを確認します(プロセスが数秒かかることがあり、新しいファイルが侵入する可能性があるため)昨日"。 次に、「昨日」のディレクトリについても同じことを行います。古いディレクトリの場合は削除するだけです。

一方、ファイルはまだ "java"と "... / 12/01"ディレクトリにあります。 あなたがUnixファイルシステムとハードリンクを使用しているので、 "ファイル"は一度だけ存在し、これらはすべてファイルへのポインタにすぎません。 それらのどれも "the"ファイルではありません、彼らはすべて同じです。

個々のファイルの移動はアトミックであるが、バルクは移動しないことがわかる。 たとえば、「today」スクリプトは実行中ですが、「yesterday」スクリプトはまだ実行されていないため、「yesterday」ディレクトリには「yesterday」と「before the day」の両方のファイルが含まれています。

トランザクショナルDBでは、一度にすべてを実行します。

しかし、単純に、それは試して真の方法です。 特に、Unixはそのイディオムで非常にうまく動作し、現代のファイルシステムはそれを非常にうまくサポートすることができます。


ここから回答がコピーされ、修正されました

読取り専用アクセス以外にフラットファイルを使用することはお勧めしません。なぜなら、一度に1つのプロセスだけがファイルに書き込んでいるように、並行性の問題に対処しなければならないからです。 代わりに、私はSQLite 、ファイルに格納されている完全に機能するSQLデータベースをお勧めします。 SQLiteにはすでに並行処理機能が組み込まれているので、ファイルロックのようなことは心配する必要はなく、読み込み速度は非常に速いです。

しかし、多くのデータベース変更を行っている場合は、 トランザクション内でそれらを一度にすべて実行するのが最善です。 これは、変更クエリが発行されるたびに、変更をファイルに一度だけ書き込みます。 これにより、複数の変更を行う速度が飛躍的に向上します。

変更クエリが発行されると、そのクエリがトランザクション内にあるかどうかにかかわらず、そのクエリが終了するまでデータベース全体がロックされます。 つまり、非常に大きなトランザクションは、データベースにアクセスする前にトランザクションが終了するのを待つ必要があるため、他のプロセスのパフォーマンスに悪影響を与える可能性があります。 実際には、これは目立つものではありませんでしたが、発行するデータベース変更クエリの数を最小限に抑えることは常に良い方法ですが、フラットファイルを使用しようとすると確かに高速です。


これをチェックしてくださいhttp://jsondb.io opensource Javaベースのデータベースは、あなたが探しているもののほとんどを持っています。 データをフラットな.jsonファイル、マルチスレッドサポート、暗号化サポート、ORMサポート、原子力サポート、XPATHベースの高度なクエリサポートとして保存します。

免責事項:私はこのデータベースを作成しました。


私はこれがフラットファイルデータベースが良いか悪いのか、なぜそれが十分な仕事をしたのか答えないように答えています。

しかし、SQLiteを指し示している人もいますが、これはうまく機能します。 あなたはJavaを使用しているので、最良の選択肢は、SQLiteとまったく同じですが、Javaで実装され、アプリケーションに埋め込まれたHSQLDBを使用することです。


独自のエンジンをネイティブコードで記述すると、汎用データベースよりも優れたパフォーマンスを発揮できます。

しかし、エンジンの品質と機能レベルは決してそれに近づくことはありません。 データベースが索引付け、トランザクション、参照整合性の中心的な機能を提供するすべてのものは、すべて自分で実装する必要があります。

ホイールを改革すること(つまり、Linuxはまさにそのようなものでした)よりも何も問題はありませんが、あなたの期待と時間を念頭に置きましょう。


これはDasblogのasp.netで行われています。 ファイルベースのストレージを使用します。

いくつかの詳細は、この古いリンクに記載されています。 http://www.hanselman.com/blog/UpcomingDasBlog19.aspx

また、 http://dasblog.info/Features.aspxで詳細を知ることもできます

私はパフォーマンスに関するいくつかの意見を聞いたことがあります。 そのタイプのシステムがあなたにとってうまくいくかどうかをもう少し調べてみることをお勧めします。 これは私がまだ聞いたことの最も近いものです。


恐ろしいアイデア。 追加するときは、何かを追加したいときはいつでもファイルの終わりまで探します。 更新するたびに、ファイル全体を書き換える必要があります。 読み込みにはテーブルスキャンが含まれます(または、書き込み/更新で同じ問題が発生する別のインデックスを維持する)。 もちろん、RDBMSが提供しているすべてのものを再実装しないと、ソリューションを適度にスケーラブルにすることができない限り、データベースを使用してください。


ファイルデータベースが十分小さければ、ランダムアクセスが失われていないので、fiatファイルデータベースを使用することができます。 ランダムアクセスの多いビッグファイルは非常に遅くなります。 複雑なクエリもありません。 結合も、集計も、グループ化もありません。フラットファイルから階層データを取得することも期待できません。 XML形式は、複雑な構造の方がはるかに優れています。


フラットファイルデータベースも可能ですが、以下の点を考慮してください。

データベースはすべてのACID要素(アトミック性、一貫性、分離性、耐久性)を達成する必要があり、すべてがフラットファイル(特に並行アクセス)で実行されることを保証する場合は、基本的に本格的なDBMS 。

なぜ、本格的なDBMSを最初に使用しないのですか?

無料のオプション(SQLite、MySQL、PostgresSQLなど)のいずれかを使用するだけで、書くことに関わる時間と費用を節約できます(何度も書き直し、私は保証します)。







architecture