Работа с большими файлами в Haskell

У меня большой файл (4+ гигабайта), скажем так, 4 байта с плавающей запятой. Я хотел бы рассматривать его как List, в том смысле, что я хотел бы иметь возможность использовать map, filter, foldl и т. Д. Однако вместо того, чтобы создавать новый список с выводом, я хотел бы записать вывод обратно в файл, и, следовательно, нужно загрузить только небольшую часть файла в память. Вы могли бы сказать, что тип называется MutableFileList

Кто-нибудь сталкивался с такой ситуацией раньше? Вместо того, чтобы заново изобретать колесо, мне было интересно, есть ли хакский способ справиться с этим?

3 ответа

Вы не должны относиться к этому как [Double] или же [Float] в памяти. То, что вы могли бы сделать, это использовать один из списочных типов упакованных массивов, таких как uvector/vector/... в компании с mmapFile или readFile, чтобы извлекать фрагменты файла за раз и обрабатывать их. Или используйте ленивый упакованный тип массива, эквивалентный ленивым байтовым строкам.

Это должно быть весьма полезно для вас. Ты можешь использовать readFile а также writeFile за то, что нужно сделать, и все делается лениво. Он сохраняет вещи в памяти, пока они еще используются, поэтому вы можете читать, обрабатывать и записывать файл, не взрывая компьютер.

Вы могли бы использовать mmap отобразить файл в память и затем обработать его. Существует модуль mmap, который обещает читать и записывать файлы mmaped и даже может работать с лениво отображенными фрагментами файлов, но я не пробовал.

Интерфейс для записи в сопоставленный файл выглядит довольно низким, так что вам придется создавать свои собственные абстракции или работать с Foreign.Ptr и тому подобное.

Другие вопросы по тегам