ext4ファイルシステムのファイルは継続的な時間検索を可能にしますか?

ext4ファイルシステムのファイルは継続的な時間検索を可能にしますか?

私は複数のデータポイントを大きなファイルにシリアル化するTensorflowのTFRecords形式を使用しています。ここで一般的な値は、データポイント当たり10KB、大容量ファイルあたりデータポイント10,000個、大容量ファイルの場合は約100MBです。 TFRecord は通常一度だけ作成され、追加されません。私考えるこれは、彼らが普及していないことを意味します。

私はTFRecordsがGoogleの内部RecordIO形式に基づいていると思います。

通常、人々はUbuntu 18.04または20.04でTensorflowとTFRecordsを実行しますが、これは通常ext4ファイルシステムだと思います。

通常、ディープラーニングエンジニアはSSD / NVMEディスクで実行されます。磁気回転プラッタの増分コストは、GPU自体の膨大なコストに比べて重要ではありません。

質問1:

ext4ファイルシステムで、特定のデータポイントがファイルの9,000,000バイトであることがわかっている場合は、その場所を検索し、一定の時間にそのデータポイントを読み取ることができますか?私が意味する定数時間は、検索深度の関数と同じです。全体のファイルサイズへの影響は心配しません。

これが真であれば、ext4ファイルシステム内のすべてのファイルに、ルックアップの場所をディスクセクタにマッピングする一種のルックアップテーブル/インデックスがあることを意味します。

私は何十年もファイルシステムを研究していませんが、FATファイルシステムが接続リストであったことを覚えているようです。次のディスクセクタが何であるかを知るために、1つのディスクセクタを読む必要がありました。これは、ファイル内の9,000,000バイトを見つけるには、最初の8,999,999バイトからすべてのディスクセクタを読み取る必要があることを意味します。例えば、ナビゲーション時間は、ナビゲーションの「深さ」に従って直線的に拡張される。私はext4が線形ではなく定数時間であることを望みます。

質問2:

私の究極の目標はTFRecordへのランダムアクセスを実行することです。 TFRecordは、ランダムアクセスではなくシリアル読み取り用に設計されています。その理由は、磁気回転プラッタの読み取り速度を最適化することに関連していると考えているからです。

ナビゲーション機能が一定時間(探索深さに応じて)であるかどうかにかかわらず、ext4ファイルシステムの大容量ファイルへのランダムアクセスは「十分に高速ですか?」正直言って、十分に速いものが何であるかは正確にはわかりませんが、単純化のために非常に高速なディープラーニングモデルが毎秒10,000のデータポイントをもたらすことができるとしましょう。ここで、各データポイントは約10KBです。大容量ファイルからランダムに抽出して抽出します。

ベストアンサー1

ファイルがディスクから断片化されていない可能性があります。しかし、時間が厳しく一定であれば、それは重要ではないかもしれません。

ext2とext3はレベル1〜4のツリーにデータブロックの位置を保存するため、クエリは一定の時間にすることはできません。さらに、ツリーのブロックは原則としてファイルシステムの任意の場所に配置できるため、一部のディスク検索が必要になる場合があります。

ext4 は、複数の連続したデータブロックを記述する範囲ツリーを格納します。したがって、ファイルに範囲が1つしかないことがわかっている場合、検索時間は一定です。ただし、断片化されている場合(または128MiBより大きいまたは複数の範囲が必要な場合)はそうではありません。

(源泉:https://www.kernel.org/doc/html/latest/filesystems/ext4/dynamic.html#the-contents-of-inode-i-block)

探す方が気になるかもしれませんが、十分速い、もしそうであれば一定時間。とにかくツリーが深すぎないため、これはより簡単な宛先であり、同じファイルに繰り返しアクセスするとすべてのメモリにすばやくロードされ、ディスク検索が削除されます(SSDではそうではありません)。 、しかしとにかく)。また、アクセスごとのシステムコールオーバーヘッドがありますが、各読み取り/書き込み前に検索を実行すると3倍になります。しかし、私の考えには、この問題を軽減するためのより進化したシステムコールがあると思います。

FATファイルシステムは接続のリストです。次のディスクセクタが何であるかを知るには、ディスクセクタを読む必要があります。これは、ファイル内の9,000,000バイトを見つけるには、最初の8,999,999バイトからすべてのディスクセクタを読み取る必要があることを意味します。例えば、ナビゲーション時間は、ナビゲーションの「深さ」に従って直線的に拡張される。

FATファイルシステムには、リンクリストを形成するブロックポインタテーブル(FATテーブル)があります。データブロック自体ではありません。したがって、たとえば、ブロックサイズが4kBの場合、9000000 / 4096〜= 2000個のポインタのみを読み取る必要があり、これは数kBの価値があります。ただし、それはリンクされたリストであり、これを繰り返すには、ルックアップ位置に比例する多くの手順が必要です(fsドライバにこれを減らす賢明な機能がない場合)。ただし、FATテーブルは連続的であり、メモリ内にある可能性があるため、ディスク検索は必要ありません。

ここで一般的な値は、データポイント当たり10KB、大容量ファイルあたりデータポイント10,000個、大容量ファイルの場合は約100MBです。

非常に高速なディープラーニングモデルが毎秒10,000のデータポイントを抽出できるとしましょう。ここでは、各データポイントは約10KBであり、大容量ファイルからランダムに抽出されます。

100MBファイルはメモリ全体に簡単に収まり(複数回)、それを維持すると検索のシステムコールオーバーヘッドも削除されます。読むだけでそれがすべてです。

書き込みを行っても特別な注意なしに、すべての書き込み操作がすぐにディスクフラッシュに到達するわけではないため、プロセス全体が遅くなる可能性があることに注意してください。 (少なくともfsync()毎回呼び出す必要があり、ドライブがユーザーをだまさないと信じる必要がありますmmap()msync()。時々再び。

おすすめ記事