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;
を削除されていますか?