LINUX.ORG.RU

Все таки fread или mmap?

 , fread, ,


0

2

Приветствую.

В продолжении темы

Имеется армка 512МБ рам и 512ГБ сд карта.

Суть - для построения журнала видео архива на носителе без файловой системы при прямом проходе (при обратном смещение 1 минута и перечитывается флешка за секунды) флешки выполняю смещение на размер кадра, для поиска нужным мне меток. Все в целом устраивало при перечитывании временных меток пока писал JPEG, который был размером где то 220КБ, но как только начал писать H264 перечитать флешку «вперед» стало проблемой иба кадры в основном около 15КБ.

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

Собсна глобальный вопрос - как бы ускорить чтение с носителя???

Второстепенный - fread vs fseeko какими буферами оперируют если читается фридом условно 20 байт и как его менять? setvbuf почему то чем то вроде setvbuf(pf, NULL, _IOFBF, 32 * 1024 * 1024) никак не влияет на скорость перечитывания носителя

Или может я просто уперся в физическую скорость флешки!?

★★★

Последнее исправление: Dimez (всего исправлений: 1)

Если читаешь небольшими фрагментами, расположенными далеко друг от друга, то рекомендую

  • отказаться от stdio и перейти на man 2 pread
  • использовать posix_fadvise(fd, 0, 0, FADV_RANDOM) — это уменьшит объем физически читаемых с флешки данных
  • если можно заранее предсказать оффсеты для чтения, можно использовать тот же posix_fadvise с FADV_WILLNEED, чтобы попросить ядро заранее прочитать нужные области носителя
  • возможно (но я не проверял), posix_fadvise(fd, offset, 20, FADV_WILLNEED) будет эффективнее, чем pread с FADV_RANDOM (т. к. последний меняет размер preread-а c 8Mb на 1Mb, а тебе надо читать гораздо меньшие объемы данных.

В общем, экспериментируй на здоровье!

kawaii_neko ★★★★
()
Ответ на: комментарий от iliyap

Поэтому я не читаю всю шлешку, а делаю перемещения и при обратном поиске у меня сотни мегабайт в секунду перечитывание, потому что там где то через 30 мб (сегодня посчитал) читаются 20 байтные метки

wolverin ★★★
() автор топика
Последнее исправление: wolverin (всего исправлений: 1)
Ответ на: комментарий от wolverin

И тут подумалось… штатно это проблема ребута, что если ловить сигнал ОС и писать адрес головы в последний сектор в этот момент…

wolverin ★★★
() автор топика
Последнее исправление: wolverin (всего исправлений: 1)
Ответ на: комментарий от kawaii_neko

отказаться от stdio и перейти на man 2 pread

хе хе, поскольку мне нужен фактически только адрес головы, то через pread/pwrite решил обновлять раз в минуту 8 байтовый файл на внутренней флешке железки откуда загружаюсь в надежде что файловая система сама случайно положит его в разные сектора и армка способна как нибудь мало мальски выполнять равномерную нагрузку на свою флешку (по большому счету время ее жизни меня волнует несколько меньше :)) ), только с O_DIRECT эти вызовы не работают.

wolverin ★★★
() автор топика