例如,我有11.8 Gb的视频文件,但我的RAM内存只有2 Gb。 VLC(或其他软件)如何处理它?他们如何将其加载到内存中?我使用VMMap工具(来自sysinternals)来查看内存,我看到:
私人160000K
工作组100000K
显然,它远低于11.8 Gb - 那么它是如何发生的?
这个问题是 不只 关于视频。 我想知道计算机通常如何处理非常大的文件。
例如,我有11.8 Gb的视频文件,但我的RAM内存只有2 Gb。 VLC(或其他软件)如何处理它?他们如何将其加载到内存中?我使用VMMap工具(来自sysinternals)来查看内存,我看到:
私人160000K
工作组100000K
显然,它远低于11.8 Gb - 那么它是如何发生的?
这个问题是 不只 关于视频。 我想知道计算机通常如何处理非常大的文件。
Answers:
这太复杂了,甚至很难开始解释,所以我只提几个程序可以运作的基本方法。
第一种也是最明显的方法,通常也是最慢的方法是直接使用磁盘上的文件。基本上,磁盘上的每个块都有自己的逻辑地址,应用程序可以直接处理磁盘上的数据。因此,如果我正在设计一个简单的文本编辑器,我可以将一个文本屏幕从磁盘加载到视频内存中,并在创建后立即将任何更改直接写入磁盘。这种方法(据我所知)今天几乎从未使用过,因为它有许多缺点。第一个问题是,与RAM相比,磁盘非常慢,CPU实际上会花费所有时间等待磁盘完成数据跟上。好的一面是我们几乎没有使用RAM,因为磁盘上的所有数据都可以直接传输到视频卡的RAM中。最重要的是,您拥有现代化的操作系统,可以更快地直接访问硬件,在许多情况下也是不可能的。
接下来,我们有(不幸的)常见且最明显的解决磁盘访问速度慢的问题:我们只需将整个文件复制到RAM并处理RAM副本。当我们完成后,我们将以某种方式将RAM版本与磁盘上的版本同步并解决问题。现代操作系统使这相对容易,因为应用程序员可以使用操作系统提供的服务来更新文件,而不必过多考虑它是如何完成的。这种方法的主要优点是速度。 RAM(与磁盘相比)非常快,当需要传输大量数据时,磁盘通常工作得更好。此外,此方法使磁盘可供其他应用程序使用,您可以在另一个应用程序使用磁盘时编辑该文件。缺点是假设整个文件可以在合理的时间内加载到RAM中,并且该文件将为RAM中的其他任务留出足够的空间。有时这不是真的。例如,我曾经不得不打开一个~3.5 GiB文本文件,结果发现大多数应用程序都认为文本文件适合RAM。
当我们使用期望大文件的应用程序时,通常使用的下一种方法是将文件的一部分加载到RAM中并使用它。当我们完成后,我们将该部分保存到磁盘并阅读下一部分。这究竟是如何工作的取决于文件本身的结构。
在某些文件类型中,您可以在文件的开头找到一个索引,您可以将其加载到RAM中并使用它来稍后确定文件中有趣部分的逻辑地址。在某些其他文件类型中,您可能需要在整个文件中搜索包含所需数据的部分,然后将该部分文件加载到RAM中。
这种方法还为巧妙的优化提供了空间,例如允许编辑文件的一部分,而另一部分在后台加载到RAM中,以便最小化打开文件所需的等待时间等。
因此,在视频文件示例中,有关格式本身的一些数据将在罚款开始时进行编码,之后,播放该文件的程序将只需要在内存中具有当前正在播放的文件部分。为了使播放更加流畅,程序还将保留尚未播放到RAM的文件的一部分。通常,要确切地确定磁盘访问数据需要多长时间并不容易。例如,由于碎片,文件的一部分可能位于磁盘的开头,而一部分可能位于磁盘的末尾。同时在播放视频的同时,另一个应用程序可能会尝试将大量数据写入磁盘。由于视频播放器已经在RAM中有一些缓冲区,因此播放应该继续而不会出现明显的中断。
这种方法具有比以前使用更少RAM的优点,同时对于程序员预测的用途来说相当快。缺点是你依靠程序员来预测文件的哪些部分将被普遍使用,以及有时预期的使用模式可能与实际使用模式不同。另一个缺点是需要精力确定文件的哪个部分需要在RAM中以及该部分需要多大。如果零件太小,你没有获得足够的速度,如果零件太大,你就会占用内存。
所以总结一下我描述的3个选项:第一个是小学的孩子,他在用铅笔强调读一个单词的同时强调他用铅笔看到的每个字母。
第二个是在一个页面上打印整个文本,如果页面像墙一样大,那么我们可能会遇到一些问题。
第三种选择就像读书。你在某个页面打开这本书,然后在它旁边打开另一页!当你读完两个,你继续下一对。
请注意,在这个答案中,我没有讨论过磁盘,RAM和处理器之间现代计算机中存在的无数缓存和抽象层。例如,在现实世界的情况下,如果你有一个程序正在执行大量磁盘访问而另一个程序试图保存一个小文件,那么该文件可能会存储在RAM中的某个缓存中,直到磁盘有足够的空闲时间来写它。此外,磁盘本身还有其内部缓存,它可能会在将文件写入磁盘之前将文件存储一段时间。此外,在读取时,操作系统本身可能会将RAM加载到RAM中的磁盘块数量超过所要求的应用程序,因为它(正确与否)预测应用程序可能很快需要它们。磁盘缓存也是如此。然后可能会发现磁盘实际上不是磁盘而是RAID,并且我们在raid控制器和每个磁盘上都有一个缓存,依此类推。
当你读一本书时,你不记得每一个字。你还记得那些与故事其他部分相关的重要细节。如果您需要记住更多细节,可以翻回并再次阅读页面。您可以通过在索引或内容中查找页码来查找页面。
当计算机播放视频时,它会读取这么多秒的视频数据,以便它有足够的数据来开始处理。它开始生成视频帧并将它们排队以显示在监视器上。它在处理完视频后会忘记视频数据,因为不再需要它。它会在其中加载更多视频数据。显示视频帧后,它也被遗忘,因为不再需要它。如果用户倒回视频,则计算机将回退到文件中的适当位置,并重复读取视频数据以及生成和排队视频帧的过程。
对于其他文件格式,计算机将以类似的方式操作。它只会读取和处理当前请求的文件部分。
It will only read and process the part of the file that is currently requested.
不幸的是,并非总是如此。某些程序可能会假设整个文件适合RAM并尝试将其加载。有趣的时间会发生,如果它不能。