在 Haskell 中处理非常大的二进制文件的最有效方法是什么?
标准答案是将整个文件作为惰性 ByteString 读取,然后使用二进制数据包之类的东西在其上编写解析器。有几个问题...
首先,像 Binary 这样的库并不能真正处理解析失败,我明确地期望解析有时会失败。
其次,我没有解析整个文件内容。我将跳过其中的大部分内容。并且将千兆字节的数据从磁盘读取到 RAM 只是让垃圾收集器再次将其丢弃似乎相当低效。
与此相关的是,我需要能够判断我想要执行的跳过是否会使我脱离文件末尾(如果确实如此,则会出错)。
我可能还需要向后查找,或者可能需要查找文件中的特定字节偏移量,这似乎不受惰性 ByteString 方法的良好支持。(最终将整个文件保存在 RAM 中是非常危险的。)
当然,另一种方法是逐个读取单个字节,并与hSeek
命令交错。但现在的问题是,一次读取一个字节的文件效率如何?听起来它也可能很慢。我不确定是否hSetBuffering
对此有影响。(?)
然后当然有mmap
。但如果用于大文件,这似乎会吓坏虚拟内存系统。(这很奇怪,考虑到这是它存在的全部目的......)
伙计们,我们怎么看?就 I/O 性能和代码可维护性而言,解决此问题的最佳方法是什么?