Название: 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. Это конечно костыль, но как я понял все равно ищется временное решение. |