Каков наиболее эффективный способ записи данных в файл? - PullRequest
0 голосов
/ 17 апреля 2009

Мне нужно написать большое количество данных в моем приложении. Данные периодически поступают и помещаются в очередь.

//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);
}

Это просто, но не эффективно. Другой возможностью является использование портов завершения ввода / вывода.

//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) );

потребитель просто удаляет неиспользуемые буферы

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

Какой способ выполнения операций ввода-вывода с большим количеством файлов в Windows является предпочтительным?

1 Ответ

1 голос
/ 14 мая 2009

Трудно сказать, потому что неясно, с какими проблемами вы сталкиваетесь при вашем текущем подходе. Асинхронизация в выделенном «записывающем» потоке не должна приводить к значительному повышению производительности.

Если у вас небольшие, но частые записи (так что частые затраты на WriteFile становятся узким местом), я бы предложил реализовать своего рода ленивые записи - собирать данные и сбрасывать их в файл при достижении некоторого порога объема.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...