三つのこと。
1) ティモシー・ウォルターズが言ったことは正しかったので、詳しく説明します。
2) 4500 個のファイルと 500Mb のデータは、単純に大量のデータとディスクへの書き込みです。データセット全体を操作している場合は、遅くなります。I/O の真実だけです。
3)他の人が述べたように、ユースケースの詳細はありません。
読み取り専用のランダム アクセス シナリオを想定すると、Timothy の言うことはほとんど役に立たず、実装は簡単です。
一言で言えば、これがあなたがすることです。
すべてのファイルを 1 つの BLOB に連結します。それらを連結している間、それらのファイル名、ファイル長、およびファイルが blob 内で開始するオフセットを追跡します。その情報を、名前でソートされたデータのブロックに書き出します。これを目次または TOC ブロックと呼びます。
次に、2 つのファイルを連結します。単純なケースでは、最初に TOC ブロックがあり、次にデータ ブロックがあります。
この形式からデータを取得する場合は、TOC でファイル名を検索し、データ ブロックの先頭からのオフセットを取得し、TOC ブロック サイズを追加して、FILE_LENGTH バイトのデータを読み取ります。単純。
賢くしたい場合は、TOC を blob ファイルの末尾に置くことができます。次に、TOC の先頭へのオフセットを最後に追加します。次に、ファイルの最後まで lseek し、4 または 8 バイト (数値のサイズに応じて) バックアップし、その値を取得して、TOC の先頭までさらに lseek します。その後、振り出しに戻ります。これにより、最初にアーカイブを 2 回再構築する必要がなくなります。
TOC をブロック (たとえば 1K バイトのサイズ) でレイアウトすると、TOC でバイナリ検索を簡単に実行できます。各ブロックにファイル情報エントリを入力するだけで、スペースがなくなったらマーカーを書き、ゼロを埋めて次のブロックに進みます。二分検索を行うには、TOC のサイズがわかっているので、途中から開始し、最初のファイル名を読み取り、そこから開始します。すぐにブロックが見つかるので、ブロックを読み込んでファイルをスキャンします。これにより、RAM に TOC 全体がなくても効率的に読み取ることができます。もう 1 つの利点は、TAR (何かを見つけるためにアーカイブをクロールする必要がある場合) のようなチェーン スキームよりも、ブロッキングに必要なディスク アクティビティが少ないことです。
ファイルをブロックサイズに合わせてパディングすることをお勧めします。ディスクは通常のサイズのデータブロックで動作しますが、これも難しくありません。
全体を再構築せずにこれを更新するのは困難です。更新可能なコンテナー システムが必要な場合は、単純なファイル システムの設計を検討することもできます。
移植性に関しては、2 進数をネットワークの順序で保存することをお勧めします。ほとんどの標準ライブラリには、これらの詳細を処理するためのルーチンが用意されているためです。