读取内存中的整个文件VS读取块

时间:2011-05-06 11:49:01

标签: c# performance file-io

我对C#和编程比较陌生,所以请耐心等待。我正在使用一个应用程序,我需要读取一些文件并以块的形式处理这些文件(例如,数据以48字节的块进行处理)。

我想知道什么是更好的,性能方面的,在内存中一次读取整个文件,然后处理它或以块的形式读取文件并直接处理它们或以更大的块读取数据(多个块)然后处理的数据。)

到目前为止我如何理解:

在内存中读取整个文件
优点:
     - 它很快,因为最昂贵的操作是寻求,一旦头部就位,它可以读得很快

缺点:
    - 消耗大量内存
     - 它在很短的时间内消耗大量内存(这是我主要害怕的,因为我不希望它明显影响整体系统性能)

以块的形式读取文件
优点:
     - 实施

更容易(更直观)
while(numberOfBytes2Read > 0)
   read n bytes
   process read data

- 消耗很少的内存

缺点:
    - 如果磁盘必须再次寻找文件并将磁头移动到适当的位置,那么可以花费更多的时间,平均成本约为12毫秒。

我知道答案取决于文件大小(和硬件)。我认为最好一次读取整个文件,但对于大文件是多少这样,一次在内存中读取的最大建议大小是多少(以字节为单位或相对于硬件 - 例如% RAM)吗

感谢您的回答和时间。

2 个答案:

答案 0 :(得分:7)

建议读取 4K或8K 缓冲区中的文件。

如果要将文件写回另一个流,您应该永远不会一次读取文件。只需读取缓冲区并将缓冲区写回。这尤其适用于网络编程。

如果您必须加载整个文件,因为您的操作(文本处理等)需要文件的整个内容,缓冲实际上没有帮助,所以我认为使用首选 File.ReadAllTextFile.ReadAllBytes


为什么4KB或8KB?

这更接近底层的Windows操作系统缓冲区。 NTFS中的文件通常存储在磁盘上的4KB或8KB块中,尽管您可以选择32KB的块。

答案 1 :(得分:1)

你的块需要很大,48个字节当然是小的,4K是合理的。