Работа с большими файлами в Haskell - PullRequest
9 голосов
/ 18 декабря 2009

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

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

Ответы [ 3 ]

12 голосов
/ 18 декабря 2009

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

9 голосов
/ 18 декабря 2009

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

1 голос
/ 18 декабря 2009

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

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

...