如何使用FParsec解析F#中的一个非常大的文件

bri*_*rns 4 f# parsing large-files bigdata fparsec

我正在尝试使用FParsec解析一个非常大的文件.该文件的大小为61GB,太大而无法保存在RAM中,所以我想生成一系列结果(即seq <'Result>),而不是列表,如果可能的话.这可以用FParsec完成吗?(我已经提出了一个实际执行此操作的简易操作实现,但由于CharStream.Seek的O(n)性能,它在实践中不能很好地工作.)

该文件是面向行的(每行一个记录),这应该使理论上可以一次分批解析1000个记录.FParsec" 提示和技巧 "部分说:

如果您正在处理大型输入文件或非常慢的解析器,那么尝试并行解析单个文件中的多个部分也是值得的.为了提高效率,必须有一种快速的方法来找到这些部分的起点和终点.例如,如果要解析大型序列化数据结构,则该格式可能允许您轻松跳过文件中的段,以便您可以将输入切换为可以并行解析的多个独立部分.另一个例子可以是编程语言,其语法使得易于跳过完整的类或函数定义,例如通过找到右括号或通过解释缩进.在这种情况下,可能不值得在遇到定义时直接解析定义,而是跳过它们,将其文本内容推送到队列中,然后并行处理该队列.

这对我来说听起来很完美:我想将每批记录预解析成一个队列,然后稍后并行完成解析.但是,我不知道如何使用FParsec API完成此任务.如何在不耗尽所有RAM的情况下创建这样的队列?

FWIW,我试图解析的文件是在这里,如果有人想尝试与我.:)

Dan*_*ian 5

想到的"显而易见的"事情是使用类似File.ReadLines的预处理文件,然后一次解析一行.

如果这不起作用(您的PDF看起来像记录长几行),那么您可以使用普通的FileStream读取创建一系列记录或1000条记录.这不需要知道记录的细节,但如果你至少可以划分记录,这将是方便的.

无论哪种方式,您最终都会得到解析器可以读取的懒惰seq.