2012-03-22 18 views
3

現在、私は単一のスレッドとfseek/fwriteを使ってループ内の大きなファイルにデータを保存しています。もちろん、節約はボトルネックです。このボトルネックを解消するために、私は非同期ファイル書き込み用のスレッドを作成できますが、これは次の反復スレッドでファイルアクセスをブロックします。同時にMSVCでファイルに非同期で書き込みますか?

Visual C/C++で同時に並行して非同期にファイルに書き込む方法はありますか?

(OSがWindowsの場合)

+0

あなたはどちらか一方を必要としていると思われますが、必ずしもそうとは限りません。 –

答えて

1

CreateFile()、SetFilePointer()、およびSetEndOfFile()を使用して、ファイルを作成し、事前にサイズを設定します。次に、ワーカースレッドでCreateFile()を使用してファイルへの追加ハンドルを開き、SetFilePointer()で目的のオフセットを探し、WriteFile()で書き込むようにします。 CreateFile()を呼び出すたびにFILE_SHARE_WRITE権限が付与される限り、一度にGENERIC_WRITE権限を持つ複数のハンドルを開くことができます。各ハンドルはファイル内に独自のポインタを保持します。

+0

'SetFilePointer'をスキップし、' OVERLAPPED'構造体の 'Offset'と' OffsetHigh'フィールドを使います。 –

+0

私はWriteFileExを試そうとしていましたが、このソリューションはきれいに聞こえます。私はこれを最初に試みます。ありがとう。 –

2

機能使用:メモリに出力ファイルをマッピングし、その後、あなたは複数のスレッドがメモリに書き込むことができ、メモリに

CreateFileMapping 

http://msdn.microsoft.com/en-us/library/windows/desktop/aa366537(v=vs.85).aspx

を同時に。ここでは、メモリマップされたファイルについて

さらに詳しい情報:

http://en.wikipedia.org/wiki/Memory-mapped_file

+0

これはおそらく最も速い解決策です。 –

+0

私はこれについて考えましたが、32ビットマシンで2GBの制限があります。ご回答有難うございます。 –

+0

@Paulでは、ファイルの任意の部分をマップしてから再度マップを解除できます。すべてを一度にメモリにマップする必要はありません。 – Ben

1

非同期IO機能、などWriteFileExは、同時アクセスを許可します。しかし、これがあなたのスループットをどのように改善すると思いますかは私には分かりません。

関連する問題