4

Например, у меня есть видео файл, который составляет 11,8 ГБ, но моя оперативная память только 2 ГБ. Как VLC (или другое программное обеспечение) справляется с этим? Как они загружают это в память? Я использовал инструмент VMMap (из sysinternals), чтобы взглянуть на память, и увидел:

Частный 160000K

Рабочий набор 100000К

Очевидно, что это намного меньше, чем 11,8 Гб -Так как это случилось?

Этот вопрос касается не только видео. Я хотел бы знать, как компьютер, в общем, обрабатывает очень большие файлы.

2 ответа2

4

Это настолько сложно, что даже трудно начать объяснять, поэтому я просто упомяну несколько основных способов работы программ.

Первый и самый очевидный способ, который часто является самым медленным, - это работа непосредственно с файлом на диске. В основном каждый блок на диске имеет свой логический адрес, и приложение может напрямую работать с данными на диске. Поэтому, если я создаю простой текстовый редактор, я могу загрузить экран текста в видеопамять с диска и записать любые изменения непосредственно на диск, как только они будут сделаны. Этот тип подхода (насколько я знаю) сегодня почти никогда не используется из-за его многочисленных недостатков. Первая проблема заключается в том, что диск настолько медленный по сравнению с ОЗУ, что ЦП практически тратит все свое время на ожидание, пока диск не поспевает за данными. Положительным моментом является то, что мы практически не используем ОЗУ, так как все данные с диска могут быть переданы непосредственно в ОЗУ на видеокарте. Помимо всего этого, у вас есть современные операционные системы, которые делают прямой доступ к оборудованию еще медленнее и во многих случаях невозможным.

Далее у нас есть (к сожалению) общее и наиболее очевидное решение проблемы медленного доступа к диску: мы просто скопируем весь файл в ОЗУ и обработаем копию ОЗУ. Когда мы закончим, мы каким-то образом синхронизируем версию RAM с версией на диске и решим проблему. Современные операционные системы делают это относительно легко, так как программист приложения может использовать сервисы, предоставляемые ОС, для обновления файла, не слишком задумываясь о том, как на самом деле это делается. Основным преимуществом этого подхода является скорость. Оперативная память (по сравнению с дисками) очень быстрая, и диски обычно работают лучше, когда требуется передать больший объем данных. Кроме того, этот подход оставляет диск доступным для использования другими приложениями, и вы можете редактировать файл, пока другое приложение работает с диском. Недостатком является то, что предполагается, что весь файл может быть загружен в ОЗУ за разумное время и что в файле останется достаточно места для других задач в ОЗУ. Иногда это не так. Например, однажды мне пришлось открыть текстовый файл ~ 3,5 ГиБ, и оказалось, что большинство приложений предполагают, что текстовый файл помещается в ОЗУ.

Следующий подход, который обычно используется, когда мы работаем с приложением, которое ожидает большие файлы, - это загрузить часть файла в оперативную память и работать с ней. Когда мы закончим, мы сохраним эту часть на диске и прочитаем следующую часть. Как именно это работает, зависит от структуры самого файла.
В некоторых типах файлов вы можете найти индекс в начале файла, который вы можете загрузить в оперативную память и использовать его для определения логических адресов интересных частей файла. В некоторых других типах файлов вам может потребоваться выполнить поиск во всем файле раздела, содержащего необходимые данные, а затем просто загрузить эту часть файла в ОЗУ.

Этот подход также предоставляет пространство для умных оптимизаций, таких как разрешение редактирования части файла, когда другая часть загружается в ОЗУ в фоновом режиме, чтобы минимизировать время ожидания, необходимое для открытия файла, и так далее.

Таким образом, в примере видеофайла некоторые данные о самом формате будут закодированы в начале штрафа, а затем программе, которая воспроизводит файл, потребуется иметь в памяти только ту часть файла, которая воспроизводится в данный момент. Чтобы сделать воспроизведение более плавным, программы также сохранят часть файла, которую еще предстоит воспроизвести в ОЗУ. Обычно нелегко точно определить, сколько времени потребуется диску для доступа к данным. Например, из-за фрагментации часть файла может находиться в начале диска, а часть - в конце диска. Также во время воспроизведения видео другое приложение может попытаться записать большие объемы данных на диск. Поскольку видеоплеер уже имеет некоторый буфер в ОЗУ, воспроизведение должно продолжаться без видимых прерываний.

Этот подход имеет преимущество в использовании меньшего количества ОЗУ, чем в предыдущем, и в то же время достаточно быстрый для использования, которое предсказывает программист. Недостатком является то, что вы полагаетесь на то, что программист может предсказать, какие части файла будут широко использоваться и как, а иногда и ожидаемый шаблон использования может отличаться от реального шаблона использования. Другим недостатком является то, что требуются усилия, чтобы точно определить, какая часть файла должна быть в ОЗУ и насколько большой должна быть эта часть. Если часть слишком мала, вы не набираете достаточную скорость, а если часть слишком велика, вы забираете ОЗУ.

Итак, суммируя 3 варианта, которые я описал: Первый - это ребенок в начальной школе, который подчеркивает каждую букву, которую видит карандашом, пытаясь прочитать слово.

Второй будет печатать весь текст на одной странице, и если страница размером с стену, мы можем столкнуться с некоторыми проблемами.

Третий вариант будет похож на чтение из книги. Вы открываете книгу на определенной странице, а прямо рядом с ней у вас открывается другая страница! Когда вы закончите читать оба, вы переходите к следующей паре.

Обратите внимание, что в этом ответе я не много говорил о бесчисленных кэшах и уровнях абстракции, которые существуют на современных компьютерах между диском, оперативной памятью и процессором. Например, в реальной ситуации, если у вас есть одна программа, которая обращается к жесткому диску, а другая пытается сохранить небольшой файл, этот файл может храниться где-то в ОЗУ в кеше, пока на диске не будет достаточно свободного времени для его записи. , Кроме того, сам диск имеет выигранный внутренний кэш, и он может хранить файл там некоторое время, прежде чем записать его на диск. Также при чтении сама ОС может загружать в ОЗУ больше дисковых блоков, чем запрашивало приложение, поскольку она (правильно или нет) предсказывала, что приложение может скоро понадобиться. То же самое относится и к дисковому кешу. Тогда может оказаться, что диск на самом деле не диск, а RAID, и что у нас есть кэш на контроллере raid и на каждом отдельном диске и так далее.

1

Когда вы читаете книгу, вы не помните каждое слово. Вы помните важные детали, которые имеют отношение к остальной части истории. Если вам нужно запомнить больше деталей, вы можете вернуться назад и снова прочитать страницу. Вы находите страницу, ища номер страницы в указателе или содержании.

Когда компьютер воспроизводит видео, он читает столько секунд видеоданных, что у него достаточно данных для начала обработки. Он начинает генерировать видеокадры и ставит их в очередь для отображения на мониторе. После обработки он забывает видеоданные, поскольку он больше не требуется. Он загружает больше видео данных на своем месте. После того, как видеокадр отображается, он тоже забывается, так как больше не требуется. Если пользователь перематывает видео, компьютер перематывает его до соответствующей точки в файле и повторяет процесс чтения видеоданных, а также генерации и организации очередей видеокадров.

Для других форматов файлов компьютер будет действовать аналогичным образом. Он будет читать и обрабатывать только ту часть файла, которая запрашивается в данный момент.

Всё ещё ищете ответ? Посмотрите другие вопросы с метками .