应用程序(和操作系统)如何处理非常大的文件?

应用程序(和操作系统)如何处理非常大的文件?

例如,我有一个 11.8 Gb 的视频文件,但我的 RAM 内存只有 2 Gb。VLC(或其他软件)如何处理它?它们如何将其加载到内存中?我使用 VMMap 工具(来自 sysinternals)查看内存,我看到:

私人 160000K

工作集 100000K

显然,它比 11.8 Gb 要小得多 - 那么这是怎么发生的呢?

这个问题不仅关于视频。我想知道计算机一般如何处理非常大的文件。

答案1

这是非常复杂的,甚至很难开始解释,所以我只提到程序运行的几个基本方式。

第一种也是最明显的方法,通常也是最慢的方法,就是直接处理磁盘上的文件。基本上,磁盘上的每个块都有自己的逻辑地址,应用程序可以直接处理磁盘上的数据。因此,如果我正在设计一个简单的文本编辑器,我可以将一屏文本从磁盘加载到视频内存中,并在进行任何更改后立即将其直接写入磁盘。这种方法(据我所知)现在几乎从未使用过,因为它有许多缺点。它的第一个问题是,与 RAM 相比,磁盘非常慢,以至于 CPU 几乎会花费所有时间等待磁盘完成数据处理。好处是我们几乎不使用 RAM,因为磁盘中的所有数据都可以直接传输到视频卡中的 RAM。最重要的是,现代操作系统使直接访问硬件的速度变得更慢,在许多情况下甚至是不可能的。

接下来,我们有一个(不幸的是)常见且最明显的解决磁盘访问缓慢问题的方法:我们将整个文件复制到 RAM 并处理 RAM 副本。完成后,我们将以某种方式将 RAM 版本与磁盘上的版本同步并解决问题。现代操作系统使这相对容易,因为应用程序程序员可以使用操作系统提供的服务来更新文件,而不必过多考虑它是如何实际完成的。这种方法的主要优点是速度。RAM(与磁盘相比)非常快,当需要传输大量数据时,磁盘通常工作得更好。此外,这种方法使磁盘可供其他应用程序使用,您可以在另一个应用程序使用磁盘时编辑文件。缺点是假设整个文件可以在合理的时间内加载到 RAM 中,并且文件将为 RAM 中的其他任务留出足够的空间。有时情况并非如此。例如,我曾经必须打开一个 ~3.5 GiB 的文本文件,结果发现大多数应用程序都假设文本文件可以放入 RAM 中。

在我们处理需要大文件的应用程序时,通常会使用下一种方法,即将文件的一部分加载到 RAM 中并对其进行处理。完成后,我们会将该部分保存到磁盘并读取下一部分。具体如何工作取决于文件本身的结构。
在某些文件类型中,您可能会在文件开头找到一个索引,您可以将其加载到 RAM 中,然后使用它来确定文件有趣部分的逻辑地址。在某些其他文件类型中,您可能需要搜索整个文件以找到包含所需数据的部分,然后将文件的该部分加载到 RAM 中。

这种方法还为巧妙的优化提供了空间,例如允许编辑文件的一部分,同时将另一部分在后台加载到 RAM 中,以最大限度地减少打开文件所需的等待时间等等。

因此,在视频文件示例中,一些有关格式本身的数据将在开始时进行编码,之后,播放文件的程序只需要在内存中保存当前正在播放的文件部分。为了使播放更流畅,程序还会将尚未播放的文件部分保留在 RAM 中。通常,很难准确确定磁盘访问数据需要多长时间。例如,由于碎片化,文件的一部分可能位于磁盘的开头,而另一部分可能位于磁盘的末尾。此外,在播放视频的同时,另一个应用程序可能会尝试将大量数据写入磁盘。由于视频播放器在 RAM 中已经有一些缓冲区,因此播放应该继续,而不会出现明显的中断。

这种方法的优点是比以前占用更少的 RAM,同时对于程序员预测的用途来说速度也相当快。缺点是,你依赖程序员来预测文件的哪些部分会被普遍使用,以及如何使用,有时预期的使用模式可能与实际使用模式不同。另一个缺点是,需要花费精力来精确确定文件的哪一部分需要放在 RAM 中以及这部分需要多大。如果这部分太小,你就得不到足够的速度,如果这部分太大,你就会占用大量的 RAM。

所以,总结一下我所描述的 3 个选项:第一个是小学里的孩子,他用铅笔在看到的每个字母下划线,同时努力阅读一个单词。

第二种方法是将整个文本打印在一页上,如果页面像墙一样大,那么我们可能会遇到一些问题。

第三个选项就像阅读一本书。你打开书的某一页,旁边还有另一页!当你读完两页后,你就可以继续读下一页。

请注意,在这个答案中,我没有过多讨论现代计算机中存在于磁盘、RAM 和处理器之间的无数缓存和抽象层。例如,在现实世界中,如果您有一个程序正在执行大量磁盘访问,而另一个程序试图保存一个小文件,则该文件可能会存储在 RAM 的某个缓存中,直到磁盘有足够的空闲时间写入它。此外,磁盘本身也有自己的内部缓存,它可能会将文件存储在那里一段时间,然后再将其写入磁盘。此外,在读取时,操作系统本身可能会将比应用程序要求的更多的磁盘块加载到 RAM 中,因为它(无论正确与否)预测应用程序可能很快就会需要它们。磁盘缓存也是如此。然后可能会发现磁盘实际上不是磁盘而是 RAID,并且我们在 RAID 控制器和每个单独的磁盘上都有一个缓存,依此类推。

答案2

当你阅读一本书时,你不会记住每一个字。你只会记住与故事其余部分相关的重要细节。如果你需要记住更多细节,你可以翻回去再读一页。你可以在索引或目录中查找页码来找到该页。

当计算机播放视频时,它会读取很多秒的视频数据,以便有足够的数据开始处理。它开始生成视频帧并将它们排队以显示在显示器上。处理完视频数据后,它会忘记它,因为不再需要它。它会加载更多视频数据来代替它。显示视频帧后,它也会被遗忘,因为不再需要它。如果用户倒回视频,计算机会倒回到文件中的适当位置并重复读取视频数据以及生成和排队视频帧的过程。

对于其他文件格式,计算机将以类似的方式运行。它只会读取和处理当前请求的文件部分。

相关内容