我想从几个文件中读取行,而不是每行。这些文件不适合内存,所以我必须从磁盘读取。在 C 中以最佳性能从多个文件中读取特定行的最佳方法是什么?
例子:
- 文件 4 的第 1 行
- 文件 2 的第 5 行
- 文件 4 中的第 5 行 ....
在 Linux 上,您可以使用mmap(2)系统调用,可能使用madvise(2)和(在另一个线程中)readhahead(2)系统调用,读取和存储数兆字节的文件。
但瓶颈可能是你的硬件。考虑使用 SSD 或速度非常快的磁盘。
如果您对行边界感兴趣,您应该明确地管理它们(并记住它们),也许要记住一些换行符的一些偏移量。
如果您使用的是 Linux 或 Windows,则可以创建文件的文件映射。这不会放入内存,并且可以让您快速访问文件的缓冲区。
在 linux 中,您可以查看 man 中的“mmap”。
在 Windows 中我不记得了,但你可以 google 一下:windows 上的文件映射。
关于逐行读取,你可以使用 fscanf 或实现你自己的函数,记住:在 linux 中读取到 "\n",在 windows 中读取到 "\r\n"。
祝你好运!
你的问题是没有读取文件。您的问题是知道要读取文件的哪一部分。
为此,您必须提前准备一个索引表,其中包含每行开头的位置。
当然,你可以用懒惰的方式构造它,那么就需要第 N 行。
不知道您使用的是哪个文件系统,但几乎可以肯定它无法自动跟踪断行符在为文件保留的内存中的位置。
也就是说,为了有一种方法可以快速访问特定行的文件,您需要建立行的索引,如果您正在处理的文件没有任何已知的适当性,您将需要至少一次完全扫描文件以构建此类索引。
显然,如果文件大于系统 RAM,您将需要在执行构建索引所需的扫描时实施明智的内存管理。
创建索引后,您只需访问要读取的唯一内存部分。