Работа с большими файлами в Haskell
У меня большой файл (4+ гигабайта), скажем так, 4 байта с плавающей запятой. Я хотел бы рассматривать его как List, в том смысле, что я хотел бы иметь возможность использовать map, filter, foldl и т. Д. Однако вместо того, чтобы создавать новый список с выводом, я хотел бы записать вывод обратно в файл, и, следовательно, нужно загрузить только небольшую часть файла в память. Вы могли бы сказать, что тип называется MutableFileList
Кто-нибудь сталкивался с такой ситуацией раньше? Вместо того, чтобы заново изобретать колесо, мне было интересно, есть ли хакский способ справиться с этим?
3 ответа
Вы не должны относиться к этому как [Double]
или же [Float]
в памяти. То, что вы могли бы сделать, это использовать один из списочных типов упакованных массивов, таких как uvector/vector/... в компании с mmapFile или readFile, чтобы извлекать фрагменты файла за раз и обрабатывать их. Или используйте ленивый упакованный тип массива, эквивалентный ленивым байтовым строкам.
Это должно быть весьма полезно для вас. Ты можешь использовать readFile
а также writeFile
за то, что нужно сделать, и все делается лениво. Он сохраняет вещи в памяти, пока они еще используются, поэтому вы можете читать, обрабатывать и записывать файл, не взрывая компьютер.
Вы могли бы использовать mmap
отобразить файл в память и затем обработать его. Существует модуль mmap, который обещает читать и записывать файлы mmaped и даже может работать с лениво отображенными фрагментами файлов, но я не пробовал.
Интерфейс для записи в сопоставленный файл выглядит довольно низким, так что вам придется создавать свои собственные абстракции или работать с Foreign.Ptr
и тому подобное.