Russian Qt Forum

Программирование => С/C++ => Тема начата: Igors от Сентябрь 04, 2010, 22:22



Название: fseek и буфер
Отправлено: Igors от Сентябрь 04, 2010, 22:22
Добрый день

Столкнулся с неприятной проблемой медленного чтения файлов. Попробовал увеличить буфер чтения с помощью setvbuf (c 4K до 64К) но эффект оказался отрицательным. Поэтому предполагаю что причина в большом числе fseek. (часто назад на несколько байт) что заставляет перечитывать буфер снова и снова. Прав ли я и как с этим бороться?

Спасибо


Название: Re: fseek и буфер
Отправлено: BRE от Сентябрь 05, 2010, 11:07
А в чем причина частого использования fseek на несколько байт назад?
Почему не закэшировать эти данные вместо их повторного чтения?
Или пересмотреть структуру файла, что-бы не нужно было производить эти перемещения.


Название: Re: fseek и буфер
Отправлено: Igors от Сентябрь 05, 2010, 12:08
А в чем причина частого использования fseek на несколько байт назад?
Почему не закэшировать эти данные вместо их повторного чтения?
Или пересмотреть структуру файла, что-бы не нужно было производить эти перемещения.
Да так-то оно так. Но этому куску уже лет 15 (если не все 20) и он велик, переделать его возможности сейчас нет. Хочется проскочить на шару  :)


Название: Re: fseek и буфер
Отправлено: BRE от Сентябрь 05, 2010, 12:23
Да так-то оно так. Но этому куску уже лет 15 (если не все 20) и он велик, переделать его возможности сейчас нет. Хочется проскочить на шару  :)
И файл наверное очень большой? Сразу в память затягивать не получиться?


Название: Re: fseek и буфер
Отправлено: Igors от Сентябрь 05, 2010, 13:11
И файл наверное очень большой? Сразу в память затягивать не получиться?
В 99% - получится. Но остается злополучный 1%  :-[  Код был написан на CodeWarrior у которого встроен буфер по умолчанию, а перенесли на Xcode - и поплыло


Название: Re: fseek и буфер
Отправлено: BRE от Сентябрь 05, 2010, 14:51
IMHO, так просто ускорить не получиться.
Скорее всего придется писать свои функции, который будут учитывать особенность с перемещением указателя назад.
Наверное сразу стоит использовать мапинг файла в память.

Для адаптации же этих функций в старом коде использовать #define.

Это конечно костыль, но как я понял все равно ищется временное решение.