Совместное использование файла на перегруженном компьютере - PullRequest
2 голосов
/ 08 ноября 2011

У меня есть компьютер под управлением Windows XP, который я использую для обработки большого количества данных, мониторов обновлений и банковских данных.Вообще это довольно загружено работой.

Один конкретный файл, содержащий данные в реальном времени, полезен для ряда пользователей.У нас есть две программы, которым нужен этот файл: одна отображает числовые данные, а другая - отображает числовые данные.Любой пользователь может запустить экземпляр любой программы на своем компьютере.Эти программы ищут файл данных в реальном времени, который обновляется каждую секунду.Они оба написаны на Perl, и меня попросили не менять ни одну из программ.

Из-за большой нагрузки на компьютер я в настоящее время запускаю программу, которая выполняет вычисления и создает файл данных в реальном времени в отдельном файле.компьютер.Эта программа просто записывает файл в реальном времени на перегруженный компьютер.Поскольку в Windows нет атомарной записи, я создал метод, который записывает в другое расширение, удаляет старый файл реального времени, а затем перемещает новый в правильное имя.К сожалению, поскольку пользовательская нагрузка на компьютер увеличивается, запись занимает больше времени (что не идеально, но возможно в режиме реального времени), но, что более раздражает, время между удалением старого файла реального времени и перемещением нового файла с правильным именем увеличиваетсяочень много, вызывая ошибки с программами Perl.Обе программы проверяют, изменилось ли время изменения файла (ни одна из них не проверяет блокировки файлов).Если файл пропадает, они сердятся и выдают сообщения об ошибках.

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

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

Наконец, стоит упомянуть, что этот же процесс выполняется на машине UNIX и не имеет ни одной из этих проблем.По этой причине я чувствую, что вина падает на потребность в атомарной записи.Я искал в интернете любой способ обойти эту проблему и попробовал несколько различных методов (например, мой текущий метод переключения расширений).

Может кто-нибудь указать мне правильное направление, чтобы я мог решить эту проблему?

Мой код написан на Python.

1 Ответ

2 голосов
/ 08 ноября 2011

os.rename() говорит:

os.rename(src, dst)
    Rename the file or directory src to dst. If dst is a directory,
    OSError will be raised. On Unix, if dst exists and is a file,
    it will be replaced silently if the user has permission. The
    operation may fail on some Unix flavors if src and dst are on
    different filesystems. If successful, the renaming will be an
    atomic operation (this is a POSIX requirement). On Windows, if
    dst already exists, OSError will be raised even if it is a file;
    there may be no way to implement an atomic rename when dst names
    an existing file.

Учитывая, что в Windows вы вынуждены удалить старый файл перед переименованием в него нового, и вам запрещено изменять сценарии чтения, чтобы допустить отсутствиефайл для настраиваемого тайм-аута (правильное решение) или сделать правильную блокировку ресурса с производителем (другое правильное решение), ваш единственный обходной путь может заключаться в том, чтобы поиграться с планировщиком процесса, чтобы операция {delete, rename} выглядела атомарно.Напишите программу на C, которая ничего не делает, кроме поиска нового файла, удаления старого и переименования нового.Запустите этот процесс «псевдоатомного переименования» с высоким приоритетом и молитесь, чтобы он не переключался между удалением и переименованием.

...