我有一个大文件(4GB以上)的内容,可以把它理解为4字节浮点数。我想把它当作列表来处理,也就是说我想使用map、filter、foldl等方法对其进行操作。但是,与其生成一个新的列表输出,我希望能够将输出写回到文件中,这样只需要在内存中加载小部分文件。你可以说我需要一种名为MutableFileList的类型。
有人遇到过这种情况吗?我想知道是否有一种Hackish的方法来处理这个问题,而不是重新发明轮子?
我有一个大文件(4GB以上)的内容,可以把它理解为4字节浮点数。我想把它当作列表来处理,也就是说我想使用map、filter、foldl等方法对其进行操作。但是,与其生成一个新的列表输出,我希望能够将输出写回到文件中,这样只需要在内存中加载小部分文件。你可以说我需要一种名为MutableFileList的类型。
有人遇到过这种情况吗?我想知道是否有一种Hackish的方法来处理这个问题,而不是重新发明轮子?
您不应该将其视为内存中的[Double]
或[Float]
。您可以使用列表式打包数组类型之一,例如uvector/vector/…与mmapFile或readFile一起使用,在处理它们时每次拉取文件的块。或者使用一种延迟打包数组类型,相当于延迟字节串。
这个链接 对你很有帮助。你可以使用 readFile
和 writeFile
完成你需要做的事情,而且它们都是惰性的。它只在仍在使用时保留内存中的内容,所以你可以读取、处理和写出文件,而不会让电脑崩溃。
你可以使用 mmap
将文件映射到内存中,然后进行处理。有一个mmap 模块承诺可以读写 mmaped 文件,甚至可以使用惰性映射的文件块,但我没有尝试过。
写入映射文件的接口似乎相当低级,因此您需要构建自己的抽象或使用Foreign.Ptr
等工具。
CreateFileMapping
和 MapViewOfFile
,两者都支持64位文件大小/偏移参数,因此这些API调用应该适用于任何大小的文件(例如 http://msdn.microsoft.com/en-us/library/aa366761%28VS.85,lightweight%29.aspx )。那么该模块是否以某种方式破坏了这个功能呢? - sth