gpt4 book ai didi

c - 解析:加载到内存或者使用流

转载 作者:行者123 更新时间:2023-11-30 14:30:17 28 4
gpt4 key购买 nike

我正在编写一个小解析器,我想知道加载要解析的数据的不同方法的优点和缺点。我想到的两种方法是:

  • 将文件内容加载到字符串中,然后解析该字符串(访问数组位置处的字符)
  • 解析为读取文件流 (fgetc)

前者将允许我拥有两个函数:一个用于 parse_from_fileparse_from_string,但我相信这种模式会占用更多内存。后者不会有使用更多内存的缺点。

有人对此事有任何建议吗?

最佳答案

读取整个文件或内存映射会更快,但如果您希望您的语言能够#include其他文件,因为这些文件将被内存映射或读入内存,则可能会导致问题也是如此。

stdio 函数会很好地工作,因为它们通常会尝试为您缓冲数据,但它们也是通用目的,因此它们也会尝试查找与从头到尾读取文件不同的使用模式,但这应该开销不要太大。

一个好的平衡是拥有一个大的循环缓冲区(x * 2 * 4096 是一个很好的大小),您可以加载文件数据,然后让您的分词器从中读取。每当一个 block 的数据被传递到您的分词器时(并且您知道它不会被推回),您可以使用文件中的新数据重新填充该 block 并更新一些缓冲区位置信息。

另一件需要考虑的事情是,分词器是否有可能需要能够从管道或直接输入某些文本的人那里读取数据。在这些情况下,您的读取返回的数据可能会少于您要求的数据,而数据又不在文件末尾,并且我上面提到的缓冲方法变得更加复杂。 stdio 缓冲对此很有用,因为它可以轻松地切换到行或 block 缓冲(或无缓冲)。

使用 gnu fast lex(flex,但不是 Adob​​e Flash 的东西)或类似的东西可以大大缓解所有这些问题。您应该考虑使用它为您的分词器生成 C 代码(词法分析)。

无论你做什么,你都应该尝试使你的代码可以轻松地更改为使用不同形式的下一个字符查看和使用函数,这样如果你改变主意,就不必重新开始。

关于c - 解析:加载到内存或者使用流,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/3458924/

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