起動時に何千もの小さなファイルの内容を読む必要があります。 Linuxでは、fopenと読み込みを使うだけで非常に高速です。 Windowsでは、これは非常にゆっくり起こります。できるだけ早くCreateFileを作成する方法
ReadFileExを使用してオーバーラップI/O(非同期I/O)を使用するように切り替えました。ここでは、データの読み込み準備が整うとWindowsがコールバックを行います。
しかし、実際に何千ものCreateFile呼び出しが依然としてボトルネックになっています。私は自分自身のバッファを用意し、NO_BUFFERINGフラグをオンにし、SERIALヒントを与えます。しかし、CreateFileの呼び出しには数十秒かかりますが、Linuxではすべての処理がはるかに高速です。
これらのファイルをより迅速に読み取る準備ができていますか?
のCreateFileの呼び出しがある:kernel32.dll
で
hFile = CreateFile(szFullFileName,
GENERIC_READ,
FILE_SHARE_READ | FILE_SHARE_WRITE,
NULL,
OPEN_EXISTING,
FILE_ATTRIBUTE_NORMAL | FILE_FLAG_OVERLAPPED | FILE_FLAG_NO_BUFFERING | FILE_FLAG_SEQUENTIAL_SCAN,
NULL);
ボトルネックがファイルシステムである可能性があります。何千もの小さなファイルを読み込む代わりにフラットファイルを使用できますか? – tenfour
Windowsの場合、1つのディレクトリに多数のファイルを扱うことは悪いことですが、それはあなたの場合です。マルチスレッドをオプションにしているので、同時に10個のスレッドを読み込みます。 – eran
この質問を見るべきであるhttp://stackoverflow.com/questions/197162/ntfs-performance-and-large-volumes-of-files-and-directories –