2009-04-17 11 views
0

アプリケーションに大量のデータを書き込む必要があります。データは定期的に到着し、キューにプッシュされます。ファイルにデータを書き込む最も効率的な方法は何ですか?

//producer 
queue_.push(new_data);// new_data is a 64kb memory range 
PostThreadMessage(worker_thread_id_, MyMsg, 0, 0);//notify the worker thread 

その後、このデータをファイルに書き込む必要があります。私はキューからデータを取得し、それを書き込む別のスレッドを持っています。

//consumer 
while(GetMessage(msg, 0, 0)) 
{ 
    data = queue_.pop(); 
    WriteFile(file_handle_, data.begin(), data.size(), &io_bytes, NULL); 
} 

これは単純ですが効率的ではありません。 もう1つは、IO完了ポートを使用することです。

//producer 
//file must be associated with io completion port 
WriteFile(file_handle_ 
     , new_data.begin() 
     , new_data.size() 
     , &io_bytes 
     , new my_overlaped(new_data)); 

消費者は、Windows上のファイルI/O処理を大量に実行するために、好ましい方法は何だけで、未使用のバッファに

my_completion_key* ck = 0; 
my_overlapped* op = 0; 
DWORD res = GetQueuedIOCompletionStatus(completion_port_, &io_bytes, &ck, &op); 
//process errors 
delete op->data; 

を削除されていますか?

答えて

1

あなたの現在のアプローチでどのような問題が発生しているのかがはっきりしないため、伝えにくいです。専用の「ライター」スレッドで非同期にすると、パフォーマンスが大幅に向上してはなりません。

書き込み回数が少ない(頻繁なWriteFileのコストがボトルネックになるような)場合は、レイジー書き込みを実装することをお勧めします。ボリュームのしきい値に達したときにデータを収集してファイルにフラッシュします。

関連する問題