2012-09-01 46 views
1

我想从几个文件读取行而不是每行行。 这些文件不适合内存,所以我必须从磁盘读取。 在C中读取具有最佳性能的几个文件中特定行的最佳方式是什么?快速读取大于内存中的文件c

实施例:

  • 从文件4
  • 从文件
  • 第5行从文件2
  • 5号线4 .......
+1

在哪个操作系统上? –

+0

线输出的顺序是否重要?规范是否需要按顺序排列每个文件中的行(例如,下一行输出不能是'文件4中的行1')? 您可能已经按顺序读取每个文件(可能并行读取不同的文件)以找到行结尾的位置。我假设没有方便的“给定文件中的所有行都是相同长度的”属性,可用于加速访问。 –

回答

2

行1在Linux中,你可以使用系统调用mmap(2)系统调用以及可能与madvise(2)以及可能(在另一线程中)系统调用以几兆字节块读取和存储映射文件。

但瓶颈可能是您的硬件。考虑使用SSD或非常快的磁盘。

如果你对线边界感兴趣,你应该明确地管理它们(并且记住它们),也许记住一些换行符的一些偏移量。

+2

实际上,由于TLB抖动,'mmap'通常比'read' /'write'低__low。或者,用某个内核程序员的话来说,[是的,内存是“缓慢”的,但是,mmap也是如此)(http://lkml.indiana.edu/hypermail/linux/kernel/0802.0/1496.html) – Nemo

2

如果您正在使用Linux或Windows,您可以创建该文件的文件映射。这将不会放入内存,并会让您快速访问文件的缓冲区。

在linux中,你可以检查man为“mmap”。

在Windows中,我不记得,但你可以谷歌它:在Windows上的文件映射。

关于逐行读取线,你就可以使用的fscanf或实现自己的功能,请记住:阅读,直到“\ n”,在Linux和Windows中为“\ r \ n”。

祝你好运!

+0

对不起,fscanf只适用于FILE阅读。我想引用:sscanf。另外,不要忘记实现自己的阅读功能。祝你好运! – user1189104

0

不知道你正在使用的文件系统,但几乎可以肯定它不会是能够自动跟踪,其中线断路器被放置在保留该文件的存储。

也就是说,为了有一种方法可以在特定的行快速访问文件,您需要构建行的索引,并且如果没有任何已知的正在处理的文件,您至少需要对文件进行一次扫描才能构建这样的索引。

显然,如果文件大于系统RAM,则需要在执行建立索引所需的扫描时实施明智的内存管理。

创建索引后,您只需访问您想要读取的内存的唯一部分。

1

您的问题没有阅读文件。 您的问题是知道要读取的文件的哪一部分。

为此,您将不得不提前准备一个索引表,并在每行的开头位置。

当然,你可以用懒惰的方式构造它,然后需要第N行。