Какая память хранит изменения в файле

Обновлено: 02.07.2024

До того, как я узнал об окончании строк, я открывал небольшие исполняемые файлы в Блокноте и полностью их уничтожал. Однако некоторые более сложные исполняемые файлы (например, Paint Shop) были слишком велики для Блокнота, и меня попросили открыть их в WordPad. Это полностью взорвало мой разум; как может простой текстовый редактор не иметь места, чтобы открыть что-то, что может открыть более сложный редактор?

Позже мне пришло в голову, что даже в очень большом текстовом файле длина строк в начале файла может изменяться без замедления работы всего компьютера. И (с некоторой помощью трюка Ctrl + A Ctrl + C Ctrl + V Ctrl + V) я обнаружил, что Блокнот, по-видимому, добавлял разрыв строки, когда строка была очень длинной, хотя перемещение курсора вперед и назад не показывало признаков разрыва строки. реальный разрыв строки существующий. Я могу только догадываться, почему это могло быть.

Как блокнот сохраняет текстовый буфер в памяти и почему возникают эти эффекты?

Похоже, это как-то связано с элементом управления EDIT, используемым Блокнотом, но документация MSDN не очень полезна.

1 Ответ 1

Блокнот (по крайней мере, изначально) был реализован как простая оболочка для элемента управления EDIT в Windows. EDIT на самом деле не предназначен для обработки больших объемов текста — он хранит текст в одном блоке памяти, выделенном с помощью LocalAlloc (что, по крайней мере, для 16-разрядных версий Windows означает, что он не может обрабатывать более 64 КБ текста). в одном элементе управления, а в окнах реального режима требуется непрерывный блок памяти для хранения всего этого). Даже в 32-битной Windows, где управление памятью больше не ограничивает ее до 64 КБ, обратная совместимость ограничивает ее, потому что сообщения, которые отправляются ей или принимаются от нее, чтобы позволить приложению управлять ею, были разработан только для 16-разрядной системы и никогда не модифицировался для 32-разрядных приложений (Microsoft хотела, чтобы исходный код Win32 был совместим с Win16, поэтому существующие сообщения должны были сохранить тот же макет[1]).

Проблемы с разрывами строк, которые вы заметили, вероятно, связаны с тем, что, хотя он может поддерживать (почти) 64 КБ текста, элемент управления Windows EDIT не может обрабатывать более 32767 символов в одной строке. Копирование и вставка строки большего размера может превысить это ограничение, но алгоритм разбиения строки, по-видимому, полагается на целые числа со знаком. Предположительно, Блокнот считывает строки из редактора и сохраняет их в файл одну за другой, и поэтому добавляет фантомную строку там, где ее нет в буфере, потому что запрошенная строка длиннее предела, поэтому она делится на две элемент управления редактированием, чтобы передать данные обратно.

Более продвинутые редакторы, такие как Write и его преемник WordPad, не хранят все содержимое в одном блоке. обычно они использовали связанный список строк, поэтому могли обрабатывать большие файлы даже в 16-разрядных окнах и не имели ограничений обратной совместимости, которые не позволяли им изменять реализации при переходе на 32-разрядную версию.

[1] – необходима цитата – я знаю, что в блоге Рэймонда Чена есть статья об этом, но я не могу найти ее прямо сейчас.

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

Данные на энергонезависимом носителе хранятся в именованных местах на носителе, которые называются файлами. Читая и записывая файлы, программы могут сохранять информацию между запусками программы.

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

Все это относится и к файлам. Чтобы открыть файл, мы указываем его имя и указываем, хотим ли мы читать или писать.

13.2. Пишем наш первый файл¶

Начнем с простой программы, которая записывает в файл три строки текста:

При открытии файла создается то, что мы называем дескриптором файла. В этом примере переменная myfile ссылается на новый объект дескриптора. Наша программа вызывает методы для дескриптора, и это вносит изменения в фактический файл, который обычно находится на нашем диске.

В строке 1 функция open принимает два аргумента. Первое — это имя файла, а второе — режим. Режим "w" означает, что мы открываем файл для записи.

С режимом "w" , если на диске нет файла с именем test.txt, он будет создан. Если он уже есть, он будет заменен файлом, который мы пишем.

Чтобы поместить данные в файл, мы вызываем метод write для дескриптора, показанного в строках 2, 3 и 4 выше. В больших программах строки 2–4 обычно заменяются циклом, который записывает в файл гораздо больше строк.

Закрытие дескриптора файла (строка 5) сообщает системе, что мы закончили запись, и делает файл на диске доступным для чтения другими программами (или нашей собственной программой).

Ручка чем-то похожа на пульт дистанционного управления телевизора

Мы все знакомы с пультом дистанционного управления для телевизора. Мы выполняем операции на пульте дистанционного управления — переключаем каналы, меняем громкость и т. д. Но реальное действие происходит на телевизоре. Итак, по простой аналогии, мы бы назвали пульт ДУ нашим дескриптором основного телевизора.

Иногда мы хотим подчеркнуть разницу — дескриптор файла не совпадает с файлом, а пульт ДУ не то же самое, что телевизор. Но в других случаях мы предпочитаем относиться к ним как к единому мысленному фрагменту или абстракции, и мы просто говорим «закрыть файл» или «переключить телеканал».

13.3. Чтение файла построчно¶

Теперь, когда файл существует на нашем диске, мы можем открыть его, на этот раз для чтения, и прочитать все строки в файле по одной за раз. На этот раз аргумент режима "r" для чтения:

Это удобный шаблон для нашего набора инструментов. В более крупных программах мы втиснули бы более обширную логику в тело цикла в строке 8 — например, если бы каждая строка файла содержала имя и адрес электронной почты одного из наших друзей, возможно, мы разделили бы строку на несколько кусочков и вызовите функцию, чтобы отправить другу приглашение на вечеринку.

В строке 8 мы подавляем символ новой строки, который print обычно добавляет к нашим строкам. Почему? Это связано с тем, что строка уже имеет собственную новую строку: метод readline в строке 3 возвращает все до включая символ новой строки. Это также объясняет логику обнаружения конца файла: когда в файле больше нет строк для чтения, readline возвращает пустую строку, в которой даже нет новой строки в конце, следовательно, его длина равна 0.

Сначала ошибка .

В нашем примере у нас есть три строки в файле, но мы входим в цикл четыре раза. В Python вы узнаете, что в файле больше нет строк, только если не сможете прочитать другую строку. В некоторых других языках программирования (например, в Паскале) дело обстоит иначе: там вы читаете три строчки, а у вас есть то, что называется заглянуть вперед — прочитав третью строчку, вы уже знаете, что строк больше нет в файле. Вам даже не разрешено пытаться прочитать четвертую строку.

Таким образом, шаблоны для построчной работы в Pascal и Python слегка различаются!

Когда вы перенесите свои навыки Python на следующий компьютерный язык, обязательно спросите, как вы узнаете, когда файл закончился: это стиль в языке «попробуй, и после неудачи ты узнаешь», или это «заглянуть вперед ”?

Если мы попытаемся открыть несуществующий файл, мы получим сообщение об ошибке:

13.4. Превращение файла в список строк¶

Часто бывает полезно извлечь данные из файла на диске и преобразовать их в список строк. Предположим, у нас есть файл, содержащий наших друзей и их адреса электронной почты, по одному на строку в файле. Но мы бы хотели, чтобы строки были отсортированы в алфавитном порядке. Хороший план состоит в том, чтобы прочитать все в список строк, затем отсортировать список, а затем записать отсортированный список обратно в другой файл:

Метод readlines в строке 2 считывает все строки и возвращает список строк.

Мы могли бы использовать шаблон из предыдущего раздела, чтобы читать каждую строку по одной за раз и создавать список самостоятельно, но намного проще использовать метод, который нам дали разработчики Python!

13.5. Чтение всего файла сразу¶

Еще один способ работы с текстовыми файлами — прочитать все содержимое файла в строку, а затем использовать наши навыки обработки строк для работы с содержимым.

Обычно мы использовали бы этот метод обработки файлов, если бы нас не интересовала строковая структура файла. Например, мы видели метод split для строк, который может разбивать строку на слова. Итак, вот как мы можем подсчитать количество слов в файле:

Обратите внимание, что мы пропустили режим "r" в строке 1. По умолчанию, если мы не указываем режим, Python открывает файл для чтения.

Возможно, пути к файлам должны быть указаны явно.

В приведенном выше примере мы предполагаем, что файл somefile.txt находится в том же каталоге, что и ваш исходный код Python. Если это не так, вам может потребоваться указать полный или относительный путь к файлу. В Windows полный путь может выглядеть как "C:\\temp\\somefile.txt" , а в системе Unix полный путь может выглядеть как "/home/jimmy/somefile. тхт" .

Мы вернемся к этому позже в этой главе.

13.6. Работа с бинарными файлами¶

Файлы, содержащие фотографии, видео, zip-файлы, исполняемые программы и т. д., называются двоичными файлами: они не организованы в строки и не могут быть открыты в обычном текстовом редакторе. Python так же легко работает с двоичными файлами, но когда мы читаем из файла, мы получаем обратно байты, а не строку. Здесь мы скопируем один бинарный файл в другой:

Здесь есть несколько новых вещей. В строках 1 и 2 мы добавили "b" в режим, чтобы сообщить Python, что файлы являются двоичными, а не текстовыми. В строке 5 мы видим, что read может принимать аргумент, указывающий, сколько байтов нужно попытаться прочитать из файла. Здесь мы решили читать и записывать до 1024 байт на каждой итерации цикла. Когда мы получаем пустой буфер из нашей попытки чтения, мы знаем, что можем выйти из цикла и закрыть оба файла.

Если мы установим точку останова в строке 6 (или напечатаем там type(buf)), мы увидим, что тип buf равен bytes< /тт> . В этом учебнике мы не делаем подробной работы с объектами bytes.

13.7. Пример¶

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

Инструкция continue в строке 9 пропускает оставшиеся строки в текущей итерации цикла, но цикл все равно будет повторяться. Этот стиль здесь выглядит немного надуманным, но часто бывает полезно сказать : «уберите строки, которые нас не интересуют, заранее, чтобы у нас была более чистая и сфокусированная логика в мясистой части цикла, которая может быть написано около 11-й строки».

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

Давайте рассмотрим еще один случай: предположим, что наш исходный файл содержит пустые строки. Будет ли эта программа в строке 6 выше находить первую пустую строку в файле и немедленно завершаться? Нет! Помните, что readline всегда включает символ новой строки в возвращаемую строку. Только когда мы пытаемся прочитать за конец файла, мы получаем пустую строку длины 0.

13.8. Каталоги¶

Файлы на энергонезависимом носителе организованы в соответствии с набором правил, известным как файловая система. Файловые системы состоят из файлов и каталогов, которые являются контейнерами как для файлов, так и для других каталогов.

Когда мы создаем новый файл, открывая его и записывая, новый файл помещается в текущий каталог (где бы мы ни находились, когда запускали программу). Точно так же, когда мы открываем файл для чтения, Python ищет его в текущем каталоге.

Если мы хотим открыть файл в другом месте, мы должны указать путь к файлу, который является именем каталога (или папки), в котором находится файл:

В этом примере (Unix) открывается файл с именем words, который находится в каталоге с именем dict , который находится в share , который находится в usr , который находится в каталоге верхнего уровня системы с именем / . Затем он считывает каждую строку в список с помощью readlines и выводит первые 5 элементов из этого списка.

Путь Windows может быть "c:/temp/words.txt" или "c:\\temp\\words.txt" . Поскольку обратная косая черта используется для экранирования таких вещей, как символы новой строки и табуляции, нам нужно написать две обратные косые черты в литеральной строке, чтобы получить одну! Таким образом, длина этих двух строк одинакова!

Мы не можем использовать / или \ как часть имени файла; они зарезервированы как разделитель между каталогом и именем файла.

Файл /usr/share/dict/words должен существовать в системах на основе Unix и содержать список слов в алфавитном порядке.

13.9. Как насчет получения чего-либо из Интернета?¶

Библиотеки Python местами довольно беспорядочны. Но вот очень простой пример, который копирует содержимое по некоторому веб-URL в локальный файл.

Функция urlretrieve — всего один вызов — может использоваться для загрузки любого контента из Интернета.

  • Ресурс, который мы пытаемся получить, должен существовать! Проверьте это в браузере.
  • Нам потребуется разрешение на запись в целевое имя файла, и файл будет создан в «текущем каталоге», то есть в той же папке, в которой сохранена программа Python.
  • Если мы находимся за прокси-сервером, требующим аутентификации (как это делают некоторые учащиеся), для обхода нашего прокси-сервера может потребоваться дополнительная обработка. Используйте местный ресурс для этой демонстрации!

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

Открытие удаленного URL возвращает то, что мы называем сокетом. Это дескриптор нашего конца соединения между нашей программой и удаленным веб-сервером. Мы можем вызывать методы чтения, записи и закрытия объекта сокета почти так же, как мы можем работать с дескриптором файла.

Для работы компьютера необходимы как память (ОЗУ), так и хранилище. Они оба хранят данные, разница заключается в том, как долго данные хранятся.

Память, хранилище и процессор

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

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

Как это работает

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

  1. На накопителе постоянно хранятся программы и файлы.
  2. Когда запрашиваются данные, например, вы открываете файл, процессор обращается к накопителю и передает долгосрочные данные (сохраненный файл) в память для краткосрочного доступа.
  3. По мере того, как вы продолжаете работать с файлом или переключаетесь на другую программу, например электронную почту, процессор обращается к данным из хранилища при первом запросе или из памяти после того, как они были перенесены с накопителя, чтобы показать вам то, что вы просили.

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

© Micron Technology, Inc., 2018. Все права защищены. Информация, продукты и/или технические характеристики могут быть изменены без предварительного уведомления. Ни Crucial, ни Micron Technology, Inc. не несут ответственности за упущения или ошибки в типографике или фотографии. Micron, логотип Micron, Crucial и логотип Crucial являются товарными знаками или зарегистрированными товарными знаками Micron Technology, Inc. Все остальные товарные знаки и знаки обслуживания являются собственностью соответствующих владельцев.

В: У нас есть компьютер с Windows 10 и 557 ГБ свободного места на жестком диске. Мы используем Windows Movie Maker для создания видеопроекта, состоящего из нескольких файлов глав продолжительностью от 15 до 20 минут каждый.

При попытке сохранить первую главу проекта с помощью команды "Сохранить фильм" в Movie Maker я получил следующее сообщение: "Недостаточно памяти для сохранения этого файла. Попробуйте сохранить его с меньшей разрешающая способность." Не могли бы вы сообщить мне, что делать дальше, так как я не хочу переходить на более низкое разрешение?

— Джуди Хаф, Стюарт

О: Большинство пользователей персональных компьютеров обычно имеют дело только с двумя типами памяти: хранилищем и оперативной памятью (или оперативной памятью).

Первый относится к фактическому объему места на данном жестком диске для хранения системных файлов (например, Windows, программ и т. д.) и файлов данных (видеофайлов, изображений, текстовых документов).

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

Сообщение Джуди Хаф относится к оперативной памяти, а не к памяти хранения.

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

Программы и задачи, запущенные на компьютере Хафа, помимо Movie Maker, исчерпали доступную оперативную память, поэтому ее недостаточно для правильного сохранения файла Movie Maker.

Понижение разрешения видеофайла может решить эту проблему, поскольку файл будет меньше и потребует меньше оперативной памяти для обработки. Но это не учитывает какие-либо другие элементы, активно работающие на машине. По-прежнему существует риск того, что снижение разрешения не приведет ни к чему, кроме снижения качества видеофайла.

Лучше закрыть некоторые или все программы, занимающие ОЗУ, при использовании Movie Maker, а затем снова попытаться сохранить файл.

Сначала закройте все окна, открытые за пределами Movie Maker, включая любой браузер, программу электронной почты или другое приложение для редактирования мультимедиа, используемое совместно с Movie Maker.

Затем закройте все программы или задачи, работающие в фоновом режиме Windows. К ним относятся антивирусная программа (которая может занимать много памяти) или другие меры безопасности, а также службы быстрого запуска, которые загружаются автоматически при запуске Windows. (Не забудьте повторно активировать антивирус и меры безопасности после завершения редактирования видео.)

Посмотрите на значки рядом с дисплеем часов компьютера — это все открытые программы, использующие оперативную память. Щелкните правой кнопкой мыши каждый значок и закройте или выйдите из элементов с помощью команды, найденной в появившемся меню. (В конце концов, на дисплее должны остаться только значки громкости и подключения к Интернету.) Это должно освободить больше оперативной памяти.

Если по-прежнему возникает проблема с сохранением файла фильма, проверьте системные характеристики (щелкните правой кнопкой мыши кнопку «Пуск» и выберите «Система», чтобы получить эту информацию) и убедитесь, что они соответствуют системным требованиям фильма или превышают их. Программа Maker. Для бесперебойной работы последней выпущенной версии Movie Maker 2012 требуется процессор с тактовой частотой не менее 1,5 ГГц и 256 МБ ОЗУ.

Если оперативной памяти недостаточно для удовлетворения этих требований, а также каких-либо дополнительных требований к оборудованию, программному обеспечению и компонентам Windows, потребуется установить дополнительную оперативную память (заранее проконсультируйтесь с техническим специалистом, чтобы убедиться, что это возможно для данной марки и модели). компьютера). Также рассмотрите другие варианты, такие как сторонние программы для редактирования видео, менее требовательные к памяти или внешние источники.

Распутать паутину

Интересно, чем Биг Мак из McDonald's отличается по питательной ценности от фрикадельки Subway? Или салат Цезарь от Panera против салата от Fresh Express? Используйте этот сайт, чтобы узнать. Введите названия двух продуктов питания или блюд из ресторана/супермаркета в доступные поля (также можно искать домашние блюда, но информация о пищевой ценности будет для стандартных рецептов, а не для персонализированных). Нажмите кнопку «Сравнить», чтобы просмотреть информацию о питании для этих продуктов, показав рядом, сколько калорий, углеводов, жиров и белков содержит каждый продукт на порцию. Это отличный ресурс для тех, кто хочет сделать более разумный выбор во время ужина вне дома.

Читайте также: