gpt4 book ai didi

parsing - 如何使用 FParsec 在 F# 中解析非常大的文件

转载 作者:行者123 更新时间:2023-12-02 11:00:54 25 4
gpt4 key购买 nike

我正在尝试使用 FParsec 解析一个非常大的文件。该文件的大小为 61GB,太大而无法保存在 RAM 中,因此如果可能的话,我想生成一系列结果(即 seq<'Result>),而不是列表。这可以用 FParsec 来完成吗? (我想出了一个偷工减料的实现,实际上可以做到这一点,但由于 CharStream.Seek 的 O(n) 性能,它在实践中效果不佳。)

该文件是面向行的(每行一条记录),理论上可以批量解析,例如一次解析 1000 条记录。 FParsec“Tips and tricks”部分说:

If you’re dealing with large input files or very slow parsers, it might also be worth trying to parse multiple sections within a single file in parallel. For this to be efficient there must be a fast way to find the start and end points of such sections. For example, if you are parsing a large serialized data structure, the format might allow you to easily skip over segments within the file, so that you can chop up the input into multiple independent parts that can be parsed in parallel. Another example could be a programming languages whose grammar makes it easy to skip over a complete class or function definition, e.g. by finding the closing brace or by interpreting the indentation. In this case it might be worth not to parse the definitions directly when they are encountered, but instead to skip over them, push their text content into a queue and then to process that queue in parallel.

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

FWIW,我试图解析的文件是 here如果有人想和我一起尝试一下。 :)

最佳答案

我想到的“明显”的事情是使用 File.ReadLines 之类的东西预处理文件。然后一次解析一行。

如果这不起作用(您的 PDF 看起来就像一条记录只有几行长),那么您可以使用普通的 FileStream 读取来创建一系列记录或 1000 条记录或类似的内容。这不需要知道记录的详细信息,但如果您至少可以分隔记录,那就很方便。

无论哪种方式,您最终都会得到解析器可以读取的惰性序列。

关于parsing - 如何使用 FParsec 在 F# 中解析非常大的文件,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/30176748/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com