1

Я создаю текстовый файл, который в итоге будет содержать около миллиарда записей. Файл генерируется программой, которая пишет в нее каждые пару секунд. Для этого он всегда открывает файл, а затем закрывает его, поэтому файл не остается открытым в режиме записи все время. Поскольку весь этот процесс занимает много времени, я хотел бы выполнить 'wc -l <имя_файла', чтобы увидеть, сколько записей уже существует (одна запись = одна строка).

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

Может ли это произойти в моей системе Linux?

2 ответа2

2

Обычно это достигается с помощью замков. В Linux существует два вида блокировок : рекомендательные и обязательные.

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

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

1

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

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

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

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