我想从几个文件读取行而不是每行行。 这些文件不适合内存,所以我必须从磁盘读取。 在C中读取具有最佳性能的几个文件中特定行的最佳方式是什么?快速读取大于内存中的文件c
实施例:
- 从文件4 从文件
- 第5行从文件2
- 5号线4 .......
我想从几个文件读取行而不是每行行。 这些文件不适合内存,所以我必须从磁盘读取。 在C中读取具有最佳性能的几个文件中特定行的最佳方式是什么?快速读取大于内存中的文件c
实施例:
行1在Linux中,你可以使用系统调用mmap(2)系统调用以及可能与madvise(2)以及可能(在另一线程中)系统调用以几兆字节块读取和存储映射文件。
但瓶颈可能是您的硬件。考虑使用SSD或非常快的磁盘。
如果你对线边界感兴趣,你应该明确地管理它们(并且记住它们),也许记住一些换行符的一些偏移量。
实际上,由于TLB抖动,'mmap'通常比'read' /'write'低__low。或者,用某个内核程序员的话来说,[是的,内存是“缓慢”的,但是,mmap也是如此)(http://lkml.indiana.edu/hypermail/linux/kernel/0802.0/1496.html) – Nemo
如果您正在使用Linux或Windows,您可以创建该文件的文件映射。这将不会放入内存,并会让您快速访问文件的缓冲区。
在linux中,你可以检查man为“mmap”。
在Windows中,我不记得,但你可以谷歌它:在Windows上的文件映射。
关于逐行读取线,你就可以使用的fscanf或实现自己的功能,请记住:阅读,直到“\ n”,在Linux和Windows中为“\ r \ n”。
祝你好运!
对不起,fscanf只适用于FILE阅读。我想引用:sscanf。另外,不要忘记实现自己的阅读功能。祝你好运! – user1189104
不知道你正在使用的文件系统,但几乎可以肯定它不会是能够自动跟踪,其中线断路器被放置在保留该文件的存储。
也就是说,为了有一种方法可以在特定的行快速访问文件,您需要构建行的索引,并且如果没有任何已知的正在处理的文件,您至少需要对文件进行一次扫描才能构建这样的索引。
显然,如果文件大于系统RAM,则需要在执行建立索引所需的扫描时实施明智的内存管理。
创建索引后,您只需访问您想要读取的内存的唯一部分。
您的问题没有阅读文件。 您的问题是知道要读取的文件的哪一部分。
为此,您将不得不提前准备一个索引表,并在每行的开头位置。
当然,你可以用懒惰的方式构造它,然后需要第N行。
在哪个操作系统上? –
线输出的顺序是否重要?规范是否需要按顺序排列每个文件中的行(例如,下一行输出不能是'文件4中的行1')? 您可能已经按顺序读取每个文件(可能并行读取不同的文件)以找到行结尾的位置。我假设没有方便的“给定文件中的所有行都是相同长度的”属性,可用于加速访问。 –