Лучше прочитать весь файл, закрыть его, а затем зациклить его, или зациклить, когда он открыт? - PullRequest
2 голосов
/ 13 марта 2019

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

Лучше закрыть файл как можно скорее, используя это:

with open('somefile.txt') as f:
    lines = f.readlines()

for line in lines:
    do_something(line)

Или просто зацикливаться на этом за один раз:

with open('somefile.txt') as f:
    for line in f:
        do_something(line)

Какой из этих методов, как правило, является лучшим и более приемлемым способом сделать это?

1 Ответ

7 голосов
/ 13 марта 2019

Нет лучшего решения.Просто потому, что эти два * далеко не эквивалентны.

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

Второй загружает только часть файла в память, обрабатывает его, а затем загружает другой кусок искоро.Это обычно медленнее (хотя, скорее всего, вы не увидите разницу, потому что часто время обработки, особенно в Python, доминирует над временем чтения), но значительно сокращает потребление памяти (при условии, что ваш файл имеет более 1 строки).Также в некоторых случаях может быть сложнее работать.Например, скажите, что вы ищете определенный файл xy\nz в файле.Теперь при загрузке «строка за строкой» вы должны помнить предыдущую строку, чтобы выполнить правильную проверку.Что сложнее реализовать (но только немного).Итак, еще раз: это зависит от того, что вы делаете.

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

Теперь вы упомянули, что контент является «критическим».Я не знаю, что это значит, но, например, если вы пытаетесь сделать обновления файла атомарными или считывает согласованность между процессами, тогда это сильно отличается от проблемы, которую вы опубликовали.И вообще сложно, поэтому я советую использовать правильную базу данных.SQLite - это простой вариант (опять же: в зависимости от вашего сценария), аналогичный наличию файла.

...