Операции записи Atomic файлов (кросс-платформа)

Как создать операцию записи атомарного файла? Файл должен быть написан службой Java и прочитан скриптами python.
Для записи чтение намного больше, чем записи. Но запись происходит в партиях и, как правило, длинна. Размер файла составляет мегабайты.

Сейчас мой подход:

  • Чтение всего файла в Python
  • Прочитайте два текстовых файла по строке одновременно --python
  • Python: самый быстрый способ обработки большого файла
  • Python конвертирует csv в xlsx
  • Проверка существования файла на удаленном SSH-сервере с использованием Python
  • Python: модуль для создания файла блокировки на основе PID?
    • Запись содержимого файла во временный файл в том же каталоге
    • Удалить старый файл
    • Переименуйте файл temp в старое имя файла.

    Правильно ли это? Как избежать ситуаций, когда старый файл удален, но новое имя файла еще не переименовано?

    Используют ли эти языки программирования ( python и java ) конструкции для блокировки и избегают этой ситуации?

  • Сохраните большой файл, используя библиотеку запросов Python
  • python записывает строку непосредственно в tarfile
  • Пропустить первую пару строк при чтении строк в файле Python
  • Запись переменных в новую строку txt-файла в python
  • Улучшить скорость чтения и преобразования из двоичного файла?
  • Прочитайте два текстовых файла по строке одновременно --python
  • 7 Solutions collect form web for “Операции записи Atomic файлов (кросс-платформа)”

    AFAIK no.

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

    EDIT – я ошибаюсь для POSIX-совместимых систем. Syscall rename POSIX выполняет замену атома, если файл с целевым именем уже существует … как указано @janneb. Этого должно быть достаточно, чтобы выполнить операцию OP атомарно.

    Однако факт остается фактом: метод Java File.renameTo() явно не гарантированно является атомарным, поэтому он не обеспечивает кросс-платформенное решение проблемы OP.

    По крайней мере, на платформах POSIX оставьте шаг 3 (удалите старый файл). В POSIX переименование внутри файловой системы гарантированно будет атомарным, а переименование поверх существующего файла заменяет его атомарно.

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

    В Linux, Solaris, Unix это легко. Просто используйте rename () из вашей программы или mv . Файлы должны находиться в одной файловой системе.

    В Windows это возможно, если вы можете управлять обеими программами. LockFileEx . Для чтения откройте shared lock файла блокировки. Для записи откройте exclusive lock файла блокировки. Блокировка является странной в Windows, поэтому я рекомендую использовать для этого отдельный файл блокировки .

    Вы можете попробовать и использовать дополнительный файл, чтобы действовать как блокировка, но я не уверен, что это сработает нормально. (Это заставит вас создать проверку блокировки и повторить логику с обеих сторон, java и python)

    Другое решение может состоять в том, чтобы не создавать файлы вообще, возможно, вы могли бы заставить свой Java-процесс прослушивать порт и обслуживать данные оттуда, а не из файла?

    Попросите сценарии python запросить разрешение у службы. Пока служба пишет, она помещает блокировку в файл. Если блокировка существует, служба отклонит запрос python.

    Попробуйте API Java FileLock

    Python - лучший язык программирования в мире.