![]() |
|
Модераторы: feodorv, GremlinProg, xvr, Fixin |
![]()
|
|
| phprus |
|
|||
|
Шустрый ![]() Профиль Группа: Участник Сообщений: 129 Регистрация: 22.8.2006 Репутация: нет Всего: 3 |
Доброго времени суток!
Хочу оптимизировать запись, в файл журнала, данных, которые находятся в нескольких буферах. В Linux версии это реализуется через открытие файла в режиме ( O_CREAT | O_WRONLY | O_APPEND ), подготовки вектора буферов struct iovec и записи его в файл при помощи функции writev. В Windows версии сейчас используется открытие файла при помощи "::_open(file_name.c_str(), ( _O_CREAT | _O_WRONLY | _O_APPEND | _O_TEXT | _O_SEQUENTIAL ), (_S_IREAD | _S_IWRITE))", но из-за отсутствия функции writev приходится собирать данные в один буфер и записывать его одним вызовом _write. Так как данных для записи много, то излишние копирования и операции распределения памяти занимают достаточную долю времени, чтобы на них стоило обратить внимание. Использование нескольких write подряд недопустимо по причине того, что функция логирования должна быть потокобезопасной, а такие гарантии дает только вызов writev или _write. Подскажите пожалуйста, можно ли реализовать в Windows дозапись в конец файла блоков данных из нескольких буферов, те по сути реализовать некоторый аналог writev из POSIX? |
|||
|
||||
| 12usver12 |
|
||||
|
Бывалый ![]() Профиль Группа: Участник Сообщений: 247 Регистрация: 5.1.2007 Репутация: 1 Всего: 1 |
мне кажется вы сильно усложняете все , используйте синхронизацию - например самый простой вариант через критическую секцию
или используйте memory mapped files |
||||
|
|||||
| phprus |
|
|||
|
Шустрый ![]() Профиль Группа: Участник Сообщений: 129 Регистрация: 22.8.2006 Репутация: нет Всего: 3 |
Возможно. Дело в том, что POSIX системы гарантируют атомарность write() и writev(), а так как остальной код итак потокобезопасен, то синхронизации не нужны, достаточно подготовить цепочку буферов и передать ее в writev. Windows-код через _write изначально был прямым переносом POSIX кода (и судя по исходникам CRT, _write тоже атомарна). Подскажите пожалуйста, как можно гарантированно дописывать данные в конец файла через memory mapped files или через WinAPI? Желательно так-же обеспечить возможность тем-же кодом писать на стандартный поток ошибок консольного приложения. |
|||
|
||||
| boostcoder |
|
|||
![]() pattern`щик ![]() ![]() ![]() ![]() Профиль Группа: Завсегдатай Сообщений: 5458 Регистрация: 1.4.2010 Репутация: нет Всего: 110 |
phprus, ты ведь активно используешь asio. там ведь есть асинхронный файловый ввод-вывод: stream_handle. по аналогии с вводом-выводом на сокетах, используй write()/async_write() и передавай ее BufferSequence.
или что? |
|||
|
||||
| vol4ek |
|
|||
![]() конь в пальто ![]() ![]() Профиль Группа: Участник Сообщений: 304 Регистрация: 1.5.2011 Где: Минск Репутация: нет Всего: 0 |
можно и API конечно. WriteFile() и SetFilePointer() на самый крайний случай. Черевато проблемами при чтении.
|
|||
|
||||
| phprus |
|
|||
|
Шустрый ![]() Профиль Группа: Участник Сообщений: 129 Регистрация: 22.8.2006 Репутация: нет Всего: 3 |
boostcoder,
Использую, есть, но для него BufferSequence должны содержать указатели, которые будут валидны до вызова completion handler, а я и хотел избавиться в том числе от лишних вызовов распределений памяти. Так как асинхронность мне в этой части не обязательна, а скорее даже вредна (если включен дебаг лог, то приложение должно падать записав максимум событий |
|||
|
||||
![]()
|
| Правила форума "C/C++: Системное программирование и WinAPI" | |
|
|
На данный раздел распространяются Правила форума и Правила раздела С++:Общие вопросы . Если Вам понравилась атмосфера форума, заходите к нам чаще! С уважением, Chipset, Step, Fixin, GremlinProg, xvr. feodorv. |
| 0 Пользователей читают эту тему (0 Гостей и 0 Скрытых Пользователей) | |
| 0 Пользователей: | |
| « Предыдущая тема | C/C++: Системное программирование и WinAPI | Следующая тема » |
|
|
По вопросам размещения рекламы пишите на vladimir(sobaka)vingrad.ru
Отказ от ответственности Powered by Invision Power Board(R) 1.3 © 2003 IPS, Inc. |