2016-04-29 27 views
1

配列数があり、それらをファイルに保存したい 他のすべての配列をメモリに取り込まずに配列15を取り出すことができますファイルから特定の配列を格納/取得する配列

私は次のように考えました。

ファイル内で2K単位でストレージを並べ替えます。

-------------------ファイル-------------------------- ---

Page 0

------------------ 2K ------------------ ------------------

Page 1

------------------ 4K --- --------------------------------

Page 2

各アレイの

私は「required_array」

という名前の配列に到達したい場合には、例えば

typedef struct { 
char* arrayNAme; 
int numberOfElements; 
int numberOfPages; 
} arrayHeader; 

だろう配列

を保存する前に、配列のヘッダ構造を格納します

私は(擬似コードで)

fp = fread(file); 
arrayHeader* ah; 
while(!EOF) 
{ 
    ah = = readHeader(fp, sizeof(arrayHeader)); 
    if(ah->name == "required_array") 
     { 
     arr = loadMyArra(fp,); 
     lseek(fp,ah->numberOfPages*2K,SEEK_SET); 
     break; 
     } 

} 

このアプローチはフィンが機能するかもしれませんeが必要ですが、パフォーマンス上の問題があります。なぜなら、nが配列の数である必要なO(n)時間が得られるまで、格納されている各配列のヘッダーにlseekする必要があるからです。

私が求めているのは、そのようなことを処理する既知の方法はありますか?またはより良いパフォーマンスを発揮できる他のテクニックに関する推奨事項はありますか?

+0

内容のテーブル、すなわち、配列名とオフセットのグローバルヘッダを持っていないのはなぜ?そのヘッダー内の名前を検索し、正しいオフセットを直接検索することができます。 –

+0

私はそれについても考えましたが、2つのことがあります.1つは私の場合、配列で配列をファイルに保存するので、最後の配列が保存されるまで待ちます。ファイルの先頭にスペースを保持する配列の総数を知っていないので、ファイルの先頭に保存してください。 .... 2.ファイルのヘッダーをすべてロードして鉱山用に検索する必要があるため、メモリの問題が発生する – becks

+1

配列の数が分かっている場合は、書き込みを行う前にフリーブロックを残すことができます配列を作成し、配列を書き、オフセットを収集します。その後、データを巻き戻して書き込みます。あるいは、ファイルの最後に表を書き込んでください。そうすれば、ファイルは拡張可能ですらあります。 (PDFファイルでそれを行います。)読んだら、終わりの直前にシークしてテーブルサイズを読んで、テーブルの先頭に向かってシークして読んでください。 –

答えて

3

@MOehmのアイデアは良いです。小さな変更でそれを使うことができます:ファイルの最後にグローバルインデックステーブルを保存します。

これはプログラムzipが使用する方式とまったく同じです。また、ファイルに書き込むときに配列の位置を収集するだけで済むので、このテーブルを簡単に計算することができます。

このスキームの(複雑な)例を見つけるにはZIPファイル形式のリファレンスを見てください。あなたが興味を持っている構造は、中央ディレクトリと呼ばれます。

リファレンス

関連する問題