读取内存中的整个文件VS读取块
我对C#和编程比较陌生,所以请耐心等待。 我正在开发一个应用程序,我需要读取一些文件并以块的forms处理这些文件(例如,数据以48字节的块为单位处理)。
我想知道什么是更好的,性能方面的,在内存中一次读取整个文件然后处理它或以块的forms读取文件并直接处理它们或以更大的块读取数据(多个数据块是然后处理)。
到目前为止我如何理解事物:
读取内存中的整个文件
优点:
– 它很快,因为最昂贵的操作是寻求,一旦头部就位,它可以读得非常快
缺点:
– 它耗费了大量的内存
– 它在很短的时间内消耗了大量内存(这是我主要害怕的,因为我不希望它明显影响整体系统性能)
以块的forms读取文件
优点:
– 实施起来更容易(更直观)
while(numberOfBytes2Read > 0) read n bytes process read data
– 消耗很少的内存
缺点:
– 如果磁盘必须再次寻找文件并将磁头移动到适当的位置,这可能需要更多的时间,平均成本约为12毫秒。
我知道答案取决于文件大小(和硬件)。 我认为最好一次读取整个文件,但是对于大文件是多少这样, 一次在内存中读取的最大建议大小是多少(以字节为单位或相对于硬件 – 例如RAM的百分比)?
谢谢你的答案和时间。
建议读取4K或8K缓冲区中的文件。
如果要将文件写回另一个流,您应该永远不会一次读取所有文件。 只需读取缓冲区并将缓冲区写回。 这尤其适用于网络编程。
如果你必须加载整个文件,因为你的操作(文本处理等)需要文件的整个内容,缓冲并没有真正帮助,所以我认为最好使用File.ReadAllText
或File.ReadAllBytes
。
为什么4KB或8KB?
这更接近底层的Windows操作系统缓冲区。 NTFS中的文件通常存储在磁盘上的4KB或8KB块中,尽管您可以选择32KB的块
你的块需要很大,48个字节当然是小的,4K是合理的。