2011-11-08 3 views
2

많은 양의 데이터를 처리하고 모니터 및 뱅크 데이터를 처리하는 데 사용하는 Windows XP를 실행하는 컴퓨터가 있습니다. 일반적으로 그것은 꽤로드되어 있습니다.오버로드 된 컴퓨터에서 파일 공유

실시간 데이터가있는 특정 파일 하나가 여러 사용자에게 유용합니다. 이 파일을 필요로하는 두 개의 프로그램이 있습니다. 하나는 숫자 데이터를 표시하고 다른 하나는 숫자 데이터를 표시하는 프로그램입니다. 모든 사용자는 자신의 시스템에서 두 프로그램의 인스턴스를 실행할 수 있습니다. 이 프로그램은 1 초마다 업데이트되는 실시간 데이터 파일을 검색합니다. 둘 다 Perl로 작성되었으며 어느 프로그램도 변경하지 말라는 요청을 받았습니다.

컴퓨터의 부하가 크기 때문에 현재 컴퓨터에서 계산을 수행하고 실시간 데이터 파일을 만드는 프로그램을 실행하고 있습니다. 이 프로그램은 단순히 실시간 파일을 오버로드 된 컴퓨터에 씁니다. Windows에는 원자 적 쓰기가 없기 때문에 다른 확장 프로그램에 쓰고 오래된 실시간 파일을 삭제 한 다음 새 파일을 올바른 이름으로 옮기는 메서드를 만들었습니다. 안타깝게도 컴퓨터에 대한 사용자로드가 증가하면 쓰기 작업이 오래 걸리고 (이상적이지는 않지만 실제로 사용 가능함) 더 고민 스럽지만 오래된 실시간 파일을 삭제하고 새 파일을 올바른 이름으로 옮기는 시간이 늘어납니다 Perl 프로그램에 오류가 발생하여 많은 도움이됩니다. 두 프로그램 모두 파일 수정 시간이 변경되었는지 확인합니다 (파일 잠금을 확인하지 않음). 파일이 누락되면 화가 나고 오류 메시지가 출력됩니다.

첫 번째 과정은 오버로드 된 컴퓨터에서이 모든 프로세스를 멀리 옮기는 것이라고 생각합니다. 내 다른 생각은 다른 컴퓨터에 파일의 복사본 번호를 만들고 다른 사용자가 다른 장소에서 파일을 읽을 (이것은 진짜 해킹 것입니다)했다.

전 세계 네트워킹 및 파일 공유에 익숙하지 않지만이를 수행하는 더 좋은 방법이 있음을 알고 있습니다. 솔직히 말해서이 전체 방법은 약간 해킹 된 것이지만 그것이 내가 여기에 왔을 때의 방법입니다.

마지막으로이 동일한 프로세스가 UNIX 시스템에서 실행되며 이러한 문제가 없음을 언급 할 필요가 있습니다. 이런 이유로 저는 원자력에 대한 필요성에 책임이 있다고 생각합니다. 나는이 문제를 해결하기 위해 인터넷을 검색해 왔으며 여러 가지 다른 방법 (예 : 현재 확장 방법 변경)을 시도했다.

이 문제를 해결할 수 있도록 누군가가 올바른 방향으로 나를 가리킬 수 있습니까?

내 코드는 Python으로 작성되었습니다.

답변

2

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 프로그램을 작성하십시오. "pseudo-atomic rename"프로세스를 높은 우선 순위로 실행하고 삭제와 이름 바꾸기간에 작업 전환을하지 않도록기도하십시오.

+0

높은 우선 순위로 프로세스를 설정하는 것에 대해서는 잘 모릅니다. 파이썬에서 함수 호출을 위해 이것을 할 수있는 방법이 있습니까? 마치 내가 파이썬 코드에서 다른 언어를 실행하고있는 것처럼 느껴진다. 내 cygwin mv 명령과 같은 것을 사용할 수있다. 이미 파일을 자동으로 대체한다. (어쩌면 당신이 말하는 것과 비슷한 방법을 구현할 수 있을까?) –

+0

물론, 게다가.스케줄러의 우선 순위를 설정할 필요는 없으며, CPU로드가있을 때 가능한 한 신뢰할 수있는 동작으로 만들기위한 제안 일뿐입니다. – Dave

+0

http://stackoverflow.com/questions/167414/is-an-atomic-file-rename-with-overwrite-possible-on-windows를 참조하십시오. – Dave