web-dev-qa-db-ja.com

人間が読めるデータベースをインデックスで最適化する

大量のデータを保存する必要があります-フォーマットの約1000万エントリ

unique hash (64 chars), value 1 (5 chars), value 2 (9 chars)

私はこのデータをすばやく連続して読み取り、削除します(ただし更新はしません)。たとえば、10行を書き込んでから、3行を読み取り、3行を削除してから、さらに書き込みと読み取りに進むことができます...

シングルスレッドのデスクトッププログラムであるため、読み取りは書き込みと削除が完了した後にのみ開始されます。データベースを使用しないようにして、ファイルシステムからデータを人間が読み取れるようにし、プログラムをダウンロードして使用する人がデータベースを表示して自分で検査できるようにします。ユーザーがLinuxOSを実行していて、プログラムがPythonで書かれていることを期待しています。

私はこのデータを保存する方法について3つの可能なオプションを考え出しました:

オプション1

データを1つのファイルに入れます。ハッシュは一意であるため、log2 Nの読み取り時間を与えるために、インデックスのように昇順で並べ替えることができます。削除と挿入は頻繁に発生し、Nが大きくなるとプロセスが遅くなります。

オプション2

一意のハッシュをファイル名として使用し、このファイル内に値を配置します。明らかなパフォーマンス上の欠点がない限り、これは私の好ましいオプションですか?私はいくつかのファイルシステムを知っています 単一のディレクトリに多数のファイルが存在する場合は遅くなります 。そして、私のプログラムのユーザーがどのファイルシステムを使用するかについては、実際には何も推測できません。すべてのファイルシステムで迅速なソリューションを選択する必要があります。

オプション3

一意のハッシュを使用して、値を格納するディレクトリを作成します。たとえば、レコードにハッシュabcdがある場合、dirとファイルbase_dir/a/b/c/d.txtを作成します。これはファイルシステムのパフォーマンスの問題を回避しますか?または、ユーザーが実行しているファイルシステムのタイプに応じて、これはオプション2と同じくらい悪いですか?

質問

だから本当に私はどのオプションを選ぶかを決めるための助けを探しています。また、私がここにリストしたものよりも優れている他のオプションがある場合は、それらを聞きたいと思います。多分人間が読めるテキストでデータを傷つけるmysqliのようないくつかのデータベースソフトウェア?それは本当に理想的ですが、ほとんどのデータベースは効率のためにバイナリを使用すると思います...

3
mulllhausen

かなり明白な解決策があります:直接ハッシュされたファイルストア。

あなたの提案に対処するには:

  1. アクセスが遅く、削除と挿入がひどく遅い。忘れてください。
  2. 妥当な時間内に100万個のファイルを提供できるファイルシステムはありません。忘れてください。
  3. まともな計画を立てるには実行可能ですが複雑です。私の選択ではありません。

直接ハッシュされたファイルストアの場合、ファイルをバケットに分割します(たとえば、4000バイト、80個のキーを保持します)。バケット全体にキーを均等に分散する独自のハッシュのハッシュ関数を考案します。各レコードをそのバケットに配置します。キーが属するバケットがいっぱいになったときに、キーにいくつかのオーバーフローバケットを割り当てます。

O(1) 1回の計算と1回の(バケット)読み取り、続いてバケットで適切なレコードを検索することにより、任意のレコードを見つけることができます。レコードを追加または削除できます。 1回の追加書き込みで、キーをバケットに配布する機能の良さにもよりますが、約80〜90%の満杯を目指します。満杯すぎると、オーバーフローバケットに頻繁に移動する必要があり、パフォーマンスが低下します。

この種のスキームを実装する方法の詳細を簡単に見つけることができます。これは、データベース以前の時代からの非常に古い手法です。非常に高速で、適度にシンプルで、問題に完全に一致します。

2
david.pfx