Проверяйте каждую минуту, был ли создан файл * .odb или нет. Если да -> Получить данные - PullRequest
0 голосов
/ 30 апреля 2018

Я хотел бы каждую минуту проверять, был ли сгенерирован файл типа «RESULTS.ODB» и если этот файл больше 1,5 гигабайт, запускается другой подпроцесс для получения данных из этого файла. Как я могу убедиться, что файл не находится в процессе записи и все включено?

Надеюсь, ты понимаешь, о чем я. Есть идеи, как с этим справиться?

Большое спасибо. :)

1 Ответ

0 голосов
/ 30 апреля 2018

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

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

Но если у вас нет контроля над записью и созданием файла, возникнут проблемы. Вы можете попробовать подход, описанный здесь: Обеспечение того, чтобы моя программа не выполняла одновременную запись в файл
Это будет читать метки времени файла и «догадываться» из них, если запись завершена или нет. Это более надежно, чем проверка размера файла, так как вы можете получить файл с превышением порогового размера, но запись все еще продолжается.

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

Если вы работаете на платформе Unix, у вас нет контроля над записью, и вам абсолютно необходимо это сделать, я бы сделал что-то вроде этого:

  1. Проверьте, существует ли файл и существует ли он, если «последняя написанная» временная метка "достаточно стар", чтобы я мог предположить, что файл там
  2. Переименовать файл под другим именем
  3. Проверьте переименованный файл, чтобы он все еще соответствовал вашим критериям
  4. Получить данные из переименованного файла

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

Я бы лучше попытался найти способ каким-либо образом объединить действия. Либо ваш писатель запускает процесс чтения, либо добавляет механизм блокировки. Запись 1,5 ГБ данных не происходит мгновенно, и в конечном итоге произойдет неожиданное.

Или, если вы определенно не можете сделать ничего подобного, можете ли вы, например, убедиться, что ваш писатель пишет максимум один раз за N минут или около того? Если вы можете быть уверены, что он никогда не будет записывать дважды в течение 5-минутного окна, вы должны подождать в вашем считывателе, пока файлу не исполнится 3 минуты, а затем переименовать его и прочитать переименованный файл. Вы также можете проверить, можете ли вы помешать автору перезаписи. Если вы можете сделать это, то вы можете безопасно обработать файл в вашем считывателе, когда он «достаточно взрослый» и не изменился в течение какого-либо льготного периода, который вы решили дать ему, и когда вы прочитаете его, вы удалите файл, разрешив следующее обновление появится.

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

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