Разве плохо открывать () и закрывать () в цикле, если скорость не проблема? - PullRequest
3 голосов
/ 12 июля 2011

Я изменил Perl-скрипт другого программиста, который использую для вывода логов.Скрипт perl просматривает файлы, и для каждого проходимого файла я открываю () журнал, записываю / печатаю в него и затем закрываю ().Это случается много раз.Я делаю это, чтобы удостовериться, что я не потеряю никакие данные, если указанный скрипт Perl зависает (в конце концов он начинает это делать, и я недостаточно осведомлен, чтобы это исправить).Поэтому у меня нет хорошей альтернативы повторению open () и close () в этом цикле.

Мой главный вопрос заключается в следующем: сценарий Perl предназначен для личного использования, поэтому снижение скорости не является проблемой,Но есть ли другие плохие вещи, которые могут последовать из этого вероятного неправильного использования открытия / закрытия?Это может звучать как глупый вопрос, но возможно ли, что это изменит мой жесткий диск быстрее, или я неправильно понимаю, как работает обработка файлов?

Заранее спасибо.

Ответы [ 3 ]

12 голосов
/ 12 июля 2011

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

Однако, если вы просто беспокоитесь о «потере данных при зависании Perl», просто установите autoflushна дескрипторе файла:

use IO::Handle;
open HANDLE, '>log.txt'
    or die "Unable to open log.txt for writing: $!";
HANDLE->autoflush(1);

Теперь каждый print до HANDLE будет очищаться автоматически.Не нужно продолжать открывать и закрывать.

Найдите «autoflush» на справочной странице perldoc для получения дополнительной информации.

4 голосов
/ 12 июля 2011

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

Блокировка файла может произойти, если к вашему файлу одновременно получит доступ что-то еще.

Производительность, как вы упомянули, isn 'Это огромная проблема.

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

2 голосов
/ 12 июля 2011

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

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...