当文件在 C++ 中打开并且我们开始读取时,整个文件是从硬盘加载到 RAM 还是一个块一个块地加载到 RAM 中?
Posted
技术标签:
【中文标题】当文件在 C++ 中打开并且我们开始读取时,整个文件是从硬盘加载到 RAM 还是一个块一个块地加载到 RAM 中?【英文标题】:When the file is opening in C++ and we start reading , does the whole file load to RAM from hard disk or just a block by a block? 【发布时间】:2020-11-24 22:05:44 【问题描述】:当文件在 C++ 中打开并开始读取时,整个文件是从硬盘加载到 RAM 还是一个块一个块地加载?
【问题讨论】:
文件可以大于你的内存,你仍然可以正常读取。所以它必须分开加载。 开始阅读disk buffer 和page cache。 【参考方案1】:您决定将多少数据读入 RAM。当您执行“getline”或将数量读入缓冲区时,您正在将其从磁盘移动到 RAM。如果文件格式是“可流式”的,您可以一次处理文件的小块,并且仍然可以执行整个操作。您需要在大部分文件中读取某些文件格式才能执行操作,这可能由于多种原因而成为问题。
如果一个文件必须在处理开始之前完全加载,你不能在获得前几个字节后立即开始工作。这是一个完全顺序的操作,比同时处理和加载要慢。
正如您提到的,RAM 比磁盘小,但即使文件可以放入 RAM,计算机现在也经常执行多任务。有 1 个进程需要 4 GB 的 RAM,而相同的操作可以用几 KB 完成可能会导致机器上的其他进程出现问题。
【讨论】:
即使您一次读取一个字节,C++ 也可能在幕后对文件进行一些缓冲。但会保持在合理的水平。 即使文件不是可流式传输的,并且您映射它,它仍然只是逐块加载。不,这不一定是一个顺序过程,因为您可以预取并且重叠 IO 也是一件事。 我从来不是说它不是逐块加载的。更重要的是,最终您是否必须将整个文件加载到内存中取决于文件的格式化方式以及您对它的处理方式。您绝对可以在不可流式格式上使用 IO 做更复杂的事情,但这通常非常特定于您的用例,并且似乎有点高于我认为这个问题被问到的水平。以上是关于当文件在 C++ 中打开并且我们开始读取时,整个文件是从硬盘加载到 RAM 还是一个块一个块地加载到 RAM 中?的主要内容,如果未能解决你的问题,请参考以下文章