кана
читать каждую строчку в файле можно лишь один раз (то есть один проход как бы)
кана
но можно прочитать все строчки с начала до середины и с конца до середины
Alexander
базовый алгоритм - идём с двух сторон и Когда встречаемся выводим
Aragaer
а
Alexander
оно константа по памяти
кана
https://github.com/kana-sama/middle-string-reader/blob/master/src/Main.hs https://github.com/kana-sama/middle-string-reader/blob/master/src/Data/ByteString/Char8/Extra.hs
Alexander
если память ограничена и часть условия, то mmap не очень надёжно вроде
Denis
с двух сторон идти будет однопроходно, про mmap сказали уже
Aragaer
я не знаю в си какого-то аццки оптимизированного способа искать в обратном направлении, а тупой цикл по символам будет сильно медленнее
Denis
почему не надежно?
Alexander
так то в продукшн с хинтами нормально
Aragaer
поэтому я бы тогда взял условно страницу в начале, страницу в конце. Сравнил число ньюлайнов, вычел бы одно из другого и одно из двух бы сместил на страницу вперед/назад
Alexander
и.к если у тебя есть место в системе то нифига оно не выгрузит память
Aragaer
так я нахожу соседнюю пару страниц, где есть центральный ньюлайн, а строка соответственно в одной из них, либо на стыке
Alexander
я делал как в том алгоритме, но читая страницами
Alexander
сначала и с конца
Alexander
страницу читаем и выдем поток начал строк
Alexander
когда кончается читается следующая и т.д.
кана
bytestring это же по сути массив
кана
?
Alexander
и функция которая потоки консьюмит
Alexander
да
кана
случайный доступ моментальный?
Alexander
да
Alexander
up to скорость доступа к памяти в общем случае
Alexander
у тебя может быть файл отмппленный в память, который выгружен
Alexander
моментальным доступ там не будет
Alexander
если я все правильно понимаю
Alexander
и сказать по виду памяти так это или нет, ты не можешь
Denis
ну так энивей же лучше ммапить, чем этого не делать
Alexander
ну и может быть в свое память
Alexander
ну если тебе нужен гарантированный отпечаток памяти, то можно и не ммапить
Alexander
а юзать sendfile
кана
а получение длины байтстринга тоже моментальный?
Alexander
или что там ещё с zerocopy
Alexander
да
Dmitry
Лучше постранично делать. Грузить страницу в конце файла, прямо проходить её. Чтобы SSE сработало. Мой побайтовый способ, когда от конца к началу идём не оптимальный.
Alexander
строго - дк
Alexander
а вот SSE все равно не сработает, вроде компилятор не настолько умный
Denis
sendfile между декрипторами
Alexander
там было что-то между памятью и дескриптором
Denis
memfd_create ?
Alexander
в продакшне я бы делал mmap и не парился
Alexander
это чтобы в памяти дескриптор сделать
Alexander
а так vmsplice
Denis
полезный продакшен сервис
Denis
находит среднюю строчку
Alexander
но они наркоманские
Denis
ну так делаешь дескриптор и потом sendfile
Alexander
словишь сотню раз сегфолт пока напишешь
Alexander
с vmsplice не нужен деспкриптор
Alexander
вроде
Alexander
вообще с удовольствием бы сходил на лекцию того кто расскажет как и когда этим зерокопи стоит пользоваться
Denis
vmsplice в пайп делает
Denis
вообще да, было бы круто
Denis
я бы тоже сходил
Denis
а я sax-parser написал
Denis
пока не супер-фичаст и надо опакетить, побенчмаркать
Denis
проще оказалось все выкинуть и сделать сразу монадный интерфейс, как Kirill предлагал
Denis
натягивание стейт машин с продолжениями на монаду мне не понравилось, не осилил
Denis
а если сразу монадный сделать, то в общем терпимо
Alexander
прикольно, а я хотел какой-то машинковый для json запилить
Denis
я запилил машинковый, но там интерфейс получился не то для чужих, не то для хищников
Leonid 🦇
а чо mmap будет быстрее чем pread страниц?
Aragaer
ну файл все равно будет подгружен в файловый кеш. После этого pread будет оттуда копировать в буфер, а в mmap ничего больше не будет - тебе просто дадут этот файловый кэш
Aragaer
если map_shared и тем более read only, то даже без copy-on-write, хотя и это не важно
Leonid 🦇
там тормозня вся на переключении в ядро
Denis
syscall-ы для чайников я бы послушал
Leonid 🦇
с mmap это будет интерапт на пэйджфаулт, с pread это будет сискол
Denis
никто не хочет провести лекцию?
Aragaer
у pread тоже начнется все с пэйджфолта, как мне кажется
Leonid 🦇
вообще знакомые на своём коде с рандомным доступом по файлу пришли к выводу что pread на 10% тормознее mmap+memcpy. но api проще
Aragaer
эээм. А если просто mmap без memcpy?
Leonid 🦇
ну им нужно было memcpy :)
Aragaer
то есть им надо было именно куда-то в нужный буфер перечитать
Aragaer
тогда да, 10% верю.
Leonid 🦇
ну х.з., если всё аллоцировано то memcpy будет куда дешевле сискола и пэйджфолта
Aragaer
memcpy все равно должен откуда-то прочитать