读取内存中的整个文件与分块读取

本文关键字:读取 文件 内存 | 更新日期: 2023-09-27 17:55:21

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

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

到目前为止,我是如何理解事情的:

读取内存
中的整个文件优点:
-它很快,因为最耗时的操作是寻找,一旦头部就位,它就可以快速读取

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

以块
为单位读取文件优点:
-更容易(更直观)实现

while(numberOfBytes2Read > 0)
   read n bytes
   process read data

- 它消耗很少的内存

缺点:
- 如果磁盘必须再次查找文件并将磁头移动到适当的位置,则可能需要更多时间,平均成本约为 12 毫秒。

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

感谢您的回答和时间。

读取内存中的整个文件与分块读取

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

如果你想把它写回另一个流,你真的不应该一次读取所有文件。只需读取缓冲区并写回缓冲区即可。这尤其适用于网络编程。

如果您因为操作(文本处理等)需要文件的全部内容而必须加载整个文件,则缓冲并没有真正的帮助,因此我认为最好使用 File.ReadAllTextFile.ReadAllBytes


为什么是 4KB 或 8KB?

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

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