Re: [c]Unix
продвигаться не по байту, а блоками размером порядка 128 кбайт, а может и больше - замеряешь сам скорость
Организовываешь два куска памяти длиною с искомый кусок, один с двойной, и за каждый цикл считываешь по куску, сцепляешь и ищешь уже в нём.
Ну я тож думал по блокам лучше когда писал пост, а написал по байтам . А что-нибудь поизящней?
два лишних копирования каждого блока?
Замапировать полностью в память и искать plain search.
А если результат больше 128K или находится на стыке одного блока с другим?
файл очень больших размеровС этим будет нормально работать?
* на 32-битных архитектурах большой файл не замапишь
* чтение вперёд быстрее, чем назад, почти всегда, и с диска, и из памяти
Это понятно. Всё правильно, но хотелось что ли как-нибудь файл перевернуть и стандартными функциями искать... Тока возможно ли это сделать не подгружая ресурсов много.
Вот именно, память важна!
Ну мапировать по кускам. Перед поиском делать страницы валидными читая по байту с каждой страницы от начала до конца.
подстроку чтоль?
мапить можно не весь файл а только кусочек.
"Замапить" что значит?Это кусок файла в память подгрузить?
---
...Я работаю антинаучным аферистом...
глянул в glibc6 - какая-то банальщина...
Что значмит ммар
man 2 mmap
А если ещё чем, то надо разбираться.
Ок, другие придложения есть?
строим конечный автомат. читаем блоками и скармливаем их задом наперёд в автомат.
можно асинхронный ввод вывод использовать а не ммап - типа пока ищем в блоке считывается следующий.
Ок, другие придложения есть?Есть предложения написать _как-нибудь_. А когда убедившься, что скорость недостаточная, тогда и продолжим. Мне почему-то сдается, что проблема надуманая...
А если результат больше 128K или находится на стыке одного блока с другим?А вот для этого существуют конечные автоматы.
PS: сорри, уже написали.
Оставить комментарий
musonline
Нужно на "с" организовать поиск с конца файла, причём файл очень больших размеров, и нужно чтобы ресурсов отжиралось поменьше при этом.Единственное, что приходит в голову это
File f=fopen("q");
fseek(f,0L,SEEK_END);
и далее продвигаться по байту назад по файлу.
Есть у кого более красивое решение?