Допустим, я хочу сохранить поток MyItem
в файл (например, в JSON). Я хотел бы остановиться, когда файл достигает определенного предела размера в байтах. Я хотел бы сделать это в Haskell... потоковая передача для меня не проблема, а как получить информацию о размере файла после каждого элемента, помещенного в этот файл...
Запись в файл в потоковом режиме и остановка при достижении заданного размера файла памяти
Ответы (1)
Я не думаю pipes
что-то для этого из коробки, но легко написать свой собственный toHandleBounded
.
На каждом шаге вы проверяете размер файла и, если он меньше ограничения, которое вы выполняете, записываете в файл еще один блок.
toHandleBounded :: MonadIO m => Integer -> Handle -> Consumer' ByteString m ()
toHandleBounded limit hd = do
current <- liftIO $ hTell hd
when (current < limit) $ do
x <- await
liftIO $ hPut hd x
toHandleBounded limit hd
main :: IO ()
main =
withFile "/dev/urandom" ReadMode $ \hIn ->
withFile "out.txt" WriteMode $ \hOut ->
runEffect $ P.fromHandle hIn >-> toHandleBounded (1024 * 500 ) hOut
person
Masse
schedule
22.02.2021
hFileSize
из того же модуля System.IO? - person jpmarinier   schedule 10.04.2020MyItem
в файле? - person danidiaz   schedule 10.04.2020hTell
работает только для доступных для поиска дескрипторов (фактических файлов, блочных устройств и т. д.). Если требования меняются и файл иногда оказывается каналом (или каким-то другим дескриптором), тогда весь код нужно будет переписать. - person dfeuer   schedule 22.02.2021lseek
может возвращатьESPIPE
, если по какой-то причине (реализации) поток не поддерживает правильное смещение. В этом случае я бы сказал, что наименее плохой вариант, вероятно, состоит в том, чтобы логика программы выполняла подсчет, возможно, используя некоторую объектную оболочку вокруг дескриптора файла на уровне ОС. - person jpmarinier   schedule 22.02.2021