フォルダーとファイルで構成される静的データベースがある場合、CGIスクリプトで使用されると考えると、SQLサーバータイプのデータベースよりもアクセスと操作が高速になりますか?
ファイルとフォルダーを使用する場合、パフォーマンスを向上させるための秘whatは何ですか?
群衆次第です。
これは、一般的な答えはありませんが、現在の状況に大きく依存する種類の質問です。 DBのオーバーヘッドといくつかのDB接続の信頼性の問題を組み合わせて、フラットファイルを使用することをお勧めしたため、最近、SQLデータベースからフラットファイルシステムにデータを移動しました。
選択を行うときに私が自問するいくつかの質問は次のとおりです。
データをどのように消費していますか?たとえば、入力した順序で最初から最後の行まで読んでいるだけでしょうか?または、複数の条件に一致する行を検索しますか?
1つのプログラムの実行中にデータにアクセスする頻度はどれくらいですか?著者としてSalingerを使用してすべての書籍を取得するために一度行ったり、複数の異なる著者を取得するために何度か行ったりしますか?いくつかの異なる基準に複数回アクセスしますか?
データを追加するにはどうすればよいですか?最後に行を追加するだけで検索に最適ですか、それとも再ソートする必要がありますか?
コードは6か月でどのように論理的になりますか?これを強調するのは、これが物事の設計においてあまりにも頻繁に忘れられていると思うからですエンジニア)。コードを保守しなければならない(または別のプロジェクトの作業後に行う)6か月の間に、どの方法でデータを保存および取得するのがより理にかなっています。フラットファイルからDBに移行すると、効率が1%向上しますが、コードを更新する必要がある場合に1週間の理解が得られれば、本当に改善できます。
情報が何であるか、アクセスパターンと規模が何であるかによって異なります。リレーショナルデータベースの最大の利点は次の2つです。
キャッシング。あなたが非常に賢明でない限り、DBサーバーのキャッシュほど良いキャッシュを書くことはできません。
オプティマイザ。
ただし、特定の特殊なアプリケーションでは、これら2つの利点のいずれも、ファイル+フォルダーのデータストアと比較して明確になりません。したがって、答えは圧倒的な「依存」です。
ファイル/フォルダーに関しては、コツは次のとおりです。
一般的な規則として、データベースはファイルよりも低速です。
ファイルのインデックス作成が必要な場合、カスタマイズされたインデックス作成構造上のハードコードされたアクセスパスは、正しく行うと常に高速になる可能性があります。
ただし、ファイルベースのソリューションよりもデータベースを選択する場合、「パフォーマンス」は目標ではありません。
データベースが提供するメリットをシステムが必要とするかどうかを自問する必要があります。その場合、小さなパフォーマンスオーバーヘッドはかなり許容できます。
そう:
基本的には、質問のほうが開発が容易です。この2つのパフォーマンスの違いは、開発時間を無駄にする価値はありません。
私の少しの経験から、サーバーベースのデータベース(ローカルマシンで提供されるものも含む)は、ローカルファイルシステムと比較してスループットが非常に遅い傾向があります。ただし、これはいくつかの事柄に依存し、そのうちの1つは漸近的な複雑さです。大きなファイルのリストをスキャンして、インデックス付きのデータベースを使用してアイテムを検索することと比較すると、データベースが優先されます。
私のほんの少しの経験はPostgreSQLについてです。 300万行のテーブルがあり、たった8,000レコードを更新しました。 8秒かかりました。
「時期尚早の最適化はすべての悪の根源です。」という引用に関しては、私はそれを一粒で考えます。データベースを使用してアプリケーションを作成し、それが遅いとわかった場合、ファイルシステムベースのアプローチまたは他の方法(SQLiteなど)に切り替えるのに非常に時間がかかる場合があります。最善の策は、ワークロードの非常に単純なプロトタイプを作成し、両方のアプローチでテストすることです。この場合、どちらが速いかを知ることが重要だと思います。
他の人が指摘したように:それは依存します!
本当に目的に応じてパフォーマンスが向上するものを見つける必要がある場合は、各形式で保存するサンプルデータを生成して、ベンチマークを実行します。 Benchmark.pmモジュールにはPerlが付属しており、次のようなものと並べて比較することが非常に簡単になります。
use Benchmark qw(:all) ;
my $count = 1000; # Some large-ish number of trials is recommended.
cmpthese($count, {
'File System' => sub { ...your filesystem code... },
'Database' => sub { ...your database code... }
});
perldoc Benchmark
と入力すると、より完全なドキュメントを取得できます。
サイト構造が適切な場合、画像に関してはdbではなくファイルを使用すると非常に便利です。一致するデータを表すフォルダーを作成し、内部に画像を配置します。たとえば、記事サイトがある場合、記事をデータベースに保存します。 dbにイメージパスを配置し、1,2,3 ..のような主キーを持つフォルダーに名前を付けて、内部にイメージを配置する必要はありません。電子書籍、音楽ファイル、ビデオ、このアプローチはすべてのメディアファイルで使用できます。何かを検索しない場合、xmlファイルでも同じロジックが機能します。
他の人が言ったように、依存する:データのサイズと性質、およびその上で実行する予定の操作に依存します。
特にCGIスクリプトの場合、すべてのページビューでデータベースサーバーに接続するとパフォーマンスが低下します。ただし、単純なファイルベースのアプローチを作成すると、パフォーマンスの問題が簡単に発生する可能性があります;-)
Berkeley DB Fileソリューションと同様に、SQLiteの使用も検討できます。これにより、ローカルファイルに格納されているデータベースへのSQLインターフェイスが作成されます。 DBIとSQLを使用してアクセスできますが、サーバー、構成、またはネットワークプロトコルはありません。これにより、将来データベースサーバーが必要な場合に簡単に移行できるようになります(例:複数のフロントエンドサーバーを使用するが、状態を共有する必要がある場合)。
詳細を知らなくても、SQLite/DBIソリューションを使用してからパフォーマンスを確認するをお勧めします。これにより、比較的簡単な起動と適切なパフォーマンスで柔軟性が得られます。
ファイルにすばやくアクセスするには、何をしているのかにもよりますが、mmapは非常に便利です。 効果的なPerl ブログで それらを丸lurみするのではなくメモリマップファイル としてこれについて書いたばかりです。
ただし、データベースサーバーの方がはるかに高速になると予想しています。あなたが何をしているか、どのような種類のデータにアクセスする必要があるかなどわからないときに、あなたにとって何が速くなるかを言うのは困難です。
データのプロファイルと、データにアクセスするために使用するロジックによって異なります。名前付きノードを単に保存して取得する必要がある場合は、ファイルシステムベースのデータベースがより高速で効率的です。 (その目的のためにBerkeley DBもご覧ください。)インデックスベースの検索を行う必要がある場合、特にキーに基づいて異なるデータセットを結合する必要がある場合は、SQLデータベースが最善の策です。
私はあなたのアプリケーションにとって最も自然と思われるソリューションを選びます。
他のDBと同様にツールであり、オーバーヘッドが発生しますが、データが静的でファイルからディレクトリを読み取る読み取り専用の場合は、次のようになります:私が行ったいくつかのテスト:ファイルの名前は.csvです。データベースでは、データベースで同じレコードを見つけるために、「date」として列にインデックスを付けていました。毎日、30K〜50Kのレコード/行と異なるタイプのデータの100列(フロート90%)があります。
DB情報:PostgreSQL 11.5、16GBのRAM
Table:
335,162,867 records
Table size: 110GB
Index size: 7GB
Total size: 117GB
Files:
Number of files: 8033
Total Files size: 158GB
Number of records/lines per file/date: 30K - 50K
ランダムな日付(1986-2019)のデータをファイルから読み取ることは、PostgreSQLで同じ日付のデータを読み取るよりも常に4-5倍高速でした