Модераторы: feodorv, GremlinProg, xvr, Fixin
  

Поиск:

Ответ в темуСоздание новой темы Создание опроса
> Аналог writev для записи в файл нескольких буферов 
V
    Опции темы
phprus
Дата 7.10.2011, 21:07 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Шустрый
*


Профиль
Группа: Участник
Сообщений: 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?
PM MAIL WWW ICQ   Вверх
12usver12
Дата 7.10.2011, 23:29 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Бывалый
*


Профиль
Группа: Участник
Сообщений: 247
Регистрация: 5.1.2007

Репутация: 1
Всего: 1



Цитата

Использование нескольких write подряд недопустимо по причине того, что функция логирования должна быть потокобезопасной

мне кажется вы сильно усложняете все , используйте синхронизацию - например самый простой вариант через критическую секцию 
Код

EnterCriticalSection(
MyWriteLog(...);
LeaveCriticalSection(

или используйте memory mapped files
PM MAIL   Вверх
phprus
Дата 8.10.2011, 09:30 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Шустрый
*


Профиль
Группа: Участник
Сообщений: 129
Регистрация: 22.8.2006

Репутация: нет
Всего: 3



Цитата(12usver12 @  8.10.2011,  02:29 Найти цитируемый пост)
мне кажется вы сильно усложняете все , используйте синхронизацию - например самый простой вариант через критическую секцию 

Возможно. Дело в том, что POSIX системы гарантируют атомарность write() и writev(), а так как остальной код итак потокобезопасен, то синхронизации не нужны, достаточно подготовить цепочку буферов и передать ее в writev. Windows-код через _write изначально был прямым переносом POSIX кода (и судя по исходникам CRT, _write тоже атомарна).


Цитата(12usver12 @  8.10.2011,  02:29 Найти цитируемый пост)
или используйте memory mapped files 

Подскажите пожалуйста, как можно гарантированно дописывать данные в конец файла через memory mapped files или через WinAPI? Желательно так-же обеспечить возможность тем-же кодом писать на стандартный поток ошибок консольного приложения.
PM MAIL WWW ICQ   Вверх
boostcoder
Дата 15.11.2011, 23:19 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


pattern`щик
****


Профиль
Группа: Завсегдатай
Сообщений: 5458
Регистрация: 1.4.2010

Репутация: нет
Всего: 110



phprus, ты ведь активно используешь asio. там ведь есть асинхронный файловый ввод-вывод: stream_handle. по аналогии с вводом-выводом на сокетах, используй write()/async_write() и передавай ее BufferSequence.

или что?
PM WWW   Вверх
vol4ek
Дата 16.11.2011, 00:31 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


конь в пальто
**


Профиль
Группа: Участник
Сообщений: 304
Регистрация: 1.5.2011
Где: Минск

Репутация: нет
Всего: 0



можно и API конечно. WriteFile() и SetFilePointer() на самый крайний случай. Черевато проблемами при чтении.

PM MAIL ICQ   Вверх
phprus
Дата 16.11.2011, 13:21 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Шустрый
*


Профиль
Группа: Участник
Сообщений: 129
Регистрация: 22.8.2006

Репутация: нет
Всего: 3



boostcoder, 
Использую, есть, но для него BufferSequence должны содержать указатели, которые будут валидны до вызова completion handler, а я и хотел избавиться в том числе от лишних вызовов распределений памяти.

Так как асинхронность мне в этой части не обязательна, а скорее даже вредна (если включен дебаг лог, то приложение должно падать записав максимум событий smile , а именно при включенном дебаг-логе подсистема записи начинала мозлить глаза при профайлинге ), то итоговое решение стало компромиссным. От копирования сообщений в промежуточный буфер в Windows я конечно не избавился, но буфера стали фиксированной длины и часть из них thread local, что позволило решить проблему с постоянными операциями выделения памяти и в итоге (+ еще некоторые изменения, не связанные с данной темой) раз в 5-10 ускорили весь процесс записи логов.
PM MAIL WWW ICQ   Вверх
  
Ответ в темуСоздание новой темы Создание опроса
Правила форума "C/C++: Системное программирование и WinAPI"
Fixin
GremlinProg
xvr
feodorv
  • Большое количество информации и примеров с использованием функций WinAPI можно найти в MSDN
  • Описание сообщений, уведомлений и примеров с использованием компонент WinAPI (BUTTON, EDIT, STATIC, и т.п.), можно найти в MSDN Control Library
  • Непосредственно, перед созданием новой темы, проверьте заголовок и удостоверьтесь, что он отражает суть обсуждения.
  • После заполнения поля "Название темы", обратите внимание на наличие и содержание панели "А здесь смотрели?", возможно Ваш вопрос уже был решен.
  • Приводите часть кода, в которой предположительно находится проблема или ошибка.
  • Если указываете код, пользуйтесь тегами [code][/code], или их кнопочными аналогами.
  • Если вопрос решен, воспользуйтесь соответствующей ссылкой, расположенной напротив названия темы.
  • Один топик - один вопрос!
  • Перед тем как создать тему - прочтите это .

На данный раздел распространяются Правила форума и Правила раздела С++:Общие вопросы .


Если Вам понравилась атмосфера форума, заходите к нам чаще! С уважением, Chipset, Step, Fixin, GremlinProg, xvr. feodorv.

 
0 Пользователей читают эту тему (0 Гостей и 0 Скрытых Пользователей)
0 Пользователей:
« Предыдущая тема | C/C++: Системное программирование и WinAPI | Следующая тема »


 




[ Время генерации скрипта: 0.0470 ]   [ Использовано запросов: 22 ]   [ GZIP включён ]


Реклама на сайте     Информационное спонсорство

 
По вопросам размещения рекламы пишите на vladimir(sobaka)vingrad.ru
Отказ от ответственности     Powered by Invision Power Board(R) 1.3 © 2003  IPS, Inc.