andrei
Я искал про фрп
andrei
И как всегда ничего не нашел
andrei
А взять либу и чето написать мне лень
Влод
может создать чат про фрп
Влод
и искать единомышленников
Влод
чтобы разобраться в теме
andrei
дежавю
parket
кана
писал кто-нибудь построчное чтение файла?
кана
чтобы на выходе IO [(Integer, String)]
?
Integer - позиция строки
кана
а то я начал и чет офигел
кана
а нужно потом еще в обретную сторону написать (читать строки с конца)
Влод
а нельзя построчно считать и зипать с [1..]?
Влод
и потом реверснуть)
кана
мне нужна позиция строки именно как смещение относительно начала
кана
а не номер ее
кана
реверснуть нельзя, все это как раз для того чтобы по памяти не вылететь
parket
Ты то все равно весь файл в память грузишь?
кана
нет
кана
читаю блоками
Влод
тебе нужно все позиции \n найти ну или других ньюлайнов
кана
я знаю что мне нужно)
Влод
блин сложно этот код выглядит
кана
моя задача - за один проход получить список строк с их позицией
Влод
ну я просто пытаюсь в данетку сыграть
кана
не вылетая по памяти
кана
код да, сложный
кана
я его только что удалил
parket
А нельзя загрузить весь файл с данными про строки в пару ([Int], String)?
ᛏᚺᛖ ᛚᛖᛋᛒᛁᚨᚾ ᛗᚨᚾ ᚷᛁᚱᛚ 🐝
а если он слишком большой по памяти?
parket
Ну, дак мы все равно имеем весь файл в структуре [(Integer, String)]
кана
не имеем
кана
список же ленивый, это стрим по сути
кана
то есть данные в него поставляются по требованию
кана
запросили первые 3 строки - первые 3 строки и прочитали
parket
Список ленивый... Может и ленивый.
кана
ну простой
lines <$> readFile "input"
память не забивает емнип
Кабачок
кана
Не работает?
да на скрине он даже не дописан и я уже отчаялся
Кабачок
Надо рефакторить
Кабачок
Но завтра
Anonymous
может,
http://hackage.haskell.org/package/base-4.10.1.0/docs/System-IO.html#v:hGetLine
и
http://hackage.haskell.org/package/containers-0.5.11.0/docs/Data-Sequence.html#t:Seq
?
parket
Ну, hGetLine + hTell похоже на правду
кана
не вариант, мне нужно читать с конца
кана
я пишу сейчас код для чтения с начала лишь потому что так проще, потом его можно исправить на чтение с конца
кана
смог реализовать для посимвольного чтения, но читать по одному символу - тоже не ок, нужно блоками
parket
Глянь как они в base делают
parket
Не, как System.IO реализован
Dmitry
Сделай mmap в bytestring, да найди все newline. Потребление памяти стремится к нулю
кана
спасибо за наводку, завтра разберусь
все это задачи не моего уровня, я умею только пропсы в реакте пробрасывать
Зигохистоморфный
Dmitry
https://hackage.haskell.org/package/mmap-0.5.9/docs/System-IO-MMap.html
Dmitry
mmapFileByteString
Dmitry
Можно потом порубить с помощью lines, и тогда внутри ByteString будут смещения
Dmitry
Чтобы получить доступ к потрохам ByteSting, надо import Data.ByteString.Internal
Dmitry
кана
но никак читать с конца это не позволит, полагаю
Dmitry
Эээ
Dmitry
Пропустил
Dmitry
А причем здесь концы?
Dmitry
Зачем с конца?
Dmitry
Нужны позиции последних строк?
кана
окей, сразу скажу, задача не реальная, это такой вид специальной олимпиады
нужно найти центральную строку в файле за один проход
подходящее решение - читать по строкам сразу с начала и с конца, пока не найдем строки с одинаковыми позициями (то есть пока не столкнемся в центре)
кана
для нечетного числа строк это просто вот так
кана
ну после реализации функции для чтения строк с конца мы получаем это
кана
Dmitry
Смахивает на задачу определения медианы. На Хабре была пару недель назад статья, как за O(1) медианы находить.
Dmitry
А что в данном случае "один проход "
Dmitry
?
Dmitry
Одно чтение файла?
кана
полагаю "чтение N байтов при файле размеров в N байтов"
кана
то есть два параллельных чтения с начала и конца до середины - подходящий вариант
Anonymous
Это не будут 2 чтения? Если параллельно..
А, 2* 1/2
Понял
Anonymous
А если в файле строки с одинаковым содержанием?
кана
ну вроде это ни на что не влияет
Dmitry
Ну, если это продакшн, а не олимпиада, я бы смапил файл, нашел бы там за один проход все переносы (пусть их оказалось N), затем по ним центральную строку - N/2. Почти что однократное чтение. А если это олимпиада, надо подумать....
Dmitry
А, ну смотри