2011-09-15 23 views
5

起動時に何千もの小さなファイルの内容を読む必要があります。 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); 
+1

ボトルネックがファイルシステムである可能性があります。何千もの小さなファイルを読み込む代わりにフラットファイルを使用できますか? – tenfour

+0

Windowsの場合、1つのディレクトリに多数のファイルを扱うことは悪いことですが、それはあなたの場合です。マルチスレッドをオプションにしているので、同時に10個のスレッドを読み込みます。 – eran

+1

この質問を見るべきであるhttp://stackoverflow.com/questions/197162/ntfs-performance-and-large-volumes-of-files-and-directories –

答えて

9

CreateFilentdll.dll内のカーネルシステムコールNtCreateFileに比べていくつかの余分なオーバーヘッドを持っています。これは、CreateFileがファイルを開くようにカーネルに要求する実際の関数です。多数のファイルを開く必要がある場合は、Win32の特殊なケースやパスの変換を回避することで、NtOpenFileがより効率的になります。これは、ディレクトリのファイル群には適用されません。

NTSYSAPI NTSTATUS NTAPI NtOpenFile(OUT HANDLE *FileHandle, IN ACCESS_MASK DesiredAccess, IN OBJECT_ATTRIBUTES *ObjectAttributes, OUT IO_STATUS_BLOCK *IoStatusBlock, IN ULONG ShareAccess, IN ULONG OpenOptions); 

HANDLE Handle; 
OBJECT_ATTRIBUTES Oa = {0}; 
UNICODE_STRING Name_U; 
IO_STATUS_BLOCK IoSb; 

RtlInitUnicodeString(&Name_U, Name); 

Oa.Length = sizeof Oa; 
Oa.ObjectName = &Name_U; 
Oa.Attributes = CaseInsensitive ? OBJ_CASE_INSENSITIVE : 0; 
Oa.RootDirectory = ParentDirectoryHandle; 

Status = NtOpenFile(&Handle, FILE_READ_DATA, &Oa, &IoSb, FILE_SHARE_READ | FILE_SHARE_WRITE | FILE_SHARE_DELETE, FILE_SEQUENTIAL_ONLY); 

主な欠点:このAPIは、Microsoftがユーザーモードで使用するためにはサポートされていません。言った、同等の機能is documented for kernel mode useとは、1993年

NtOpenFileでWindows NTの最初のリリースから変更されていないもあなたが削減すべき既存のディレクトリハンドル(例ではParentDirectoryHandle)に関連するファイルを開くことができますディレクトリを探す際のファイルシステムのオーバーヘッドの一部に

最後に、NTFSは、ファイル数が多いディレクトリの処理が遅すぎるかもしれないと、Carey Gregory氏は述べています。

+0

NTFSが「遅い」という記述も、NtCreateFileがCreateFileより高速であるという文もどちらも完全に構成されていません。誰かが何かの証拠を投稿しない限り、私は間違った呼び出しをしなければならない - いくつかのCPUサイクルを除いて、両方の機能は夜間に同じ動作をし、NTFSは適度に高速なファイルシステムである。 – specializt

+0

http://stackoverflow.com/questions/197162/ntfs-performance-and-large-volumes-of-files-and-directoriesを参照してください。 –

+0

ええと... thatsever何の証拠もありません。データなし。 – specializt

0

Createファイルを発行する前に、効率的にMFTでページングを試してください。これは、FSCTL_ENUM_USN_DATAを発行することによって実行できます。

関連する問題