"파일업데이트" 방법 조언좀 부탁드립니다.
글쓴이: pogusm / 작성시간: 일, 2011/01/09 - 5:19오전
클라이언트 PC에 A.txt 라는 텍스트 파일에는 100만줄의 자료가 있습니다.
어느날 서버에 있는 A.txt 라는 파일에서 10만번째줄이 수정되고, 1,000,001줄이 추가되었습니다.
이럴때, A파일을 몽땅 새로 다운로드 받는것보다
변경된 내용만 diff로 추출해서 patch로 업데이트 하는것이 서버-클라이언트간 네트웍 부하도 적고 효과적인 방법이라고 생각합니다.
(특히나 클라이언트의 수가 수백만~수천만일때는 더욱더 그럴거라고 생각됩니다)
그데 만약, B.db라는 sqlite DB파일(이진파일)을 위와같은 방법으로 업데이트하려고 한다면 가능할까요?
diff, patch가 이진파일에서도 적용이 가능한가요?
아니면 비슷한 다른 프로그램이 있을까요?
변경된 내용에 대해서만 sql구문?을 추출해서, 그것으로 적용하는 방법 말고,
diff, patch 같은방법으로 서버-클라이언트간의 B.db파일을 동기화 하고 싶습니다.
조언 부탁드립니다.
Forums:
[불확신 자답]
두개의 sqlite DB파일 test01.db , test02.db에 대하여
$ diff -u -a --binary test01.db test02.db > patch.diff
$ patch --binary test01.db < patch.diff
라고 해주니, 결과적으로 test01.db == test02.db 로 동기화 되었습니다.
또한,
C로 만들어지고, 컴파일된 두개의 실행파일 r_original , r_new에 대하여
$ diff -u -a --binary r_original r_new > patch.diff
$ patch --binary r_original < patch.diff
라고 해주니, 결과적으로 r_original == r_new 로 동기화 되었습니다.
맞게 제대로 사용한건지 어떤지 확신할 수가 없어도 [불확신 자답] 이라고 제목을 달았습니다.
맞게 사용한건지 아닌건지, 조언 해주시면 고맙겠습니다.
ps. 검색해보니 binary 전용 diff/patch 유틸도 있어보이던데...
가급적 기본적으로 설치된 diff/patch를 이용해서 위의 작업을 하는것이 목적입니다.
클라이언트의 수가 수백만~수천만이라는 가정을 하셨다면
클라이언트의 수가 수백만~수천만이라는 가정을 하셨다면 제 생각에는 binary patch가 더 비 효울적일 수도 있을 것 같습니다. 별도의 process를 실행해야 하는데, 수백만~수천만 (실제 이정도는 안되겠지만.. 그래도 상당하겠죠..) 개의 프로세스가 떠야 한다면 시스템 입장에서는 "Oh my god.... 누가 이렇게 design 했어.." 라고 생각할 수도 있습니다. :-) 아니면.. diff를 embed로 구현하는 하시든지.. 그리고 file size에 따라 달라질 수도 있고요.
CGI에서 C나 perl이 php 보다 능력이 좋으면서도 도태되는 이유가 마로 fork를 해서 수행을 해야하고, 이 때의 overhead가 php의 embed 방식이 부각되게 만드는 것이죠.
그리고 제 개인적인 생각으로는 서버에서 background 작업으로 하는 것이 훨씬 모양새가 좋지 않을까 싶군요.
조언 감사합니다.
이래저래 많은 생각을 해봤는데,
diff는 줄단위 비교를 하므로, 바이너리파일에 diff/patch를 적용하는건 역시나 효과적이지 못한 방법같습니다.
"주소록관리프로그램v1.0" 라는 프로그램패키지를 인터넷을 통해 업데이트 될때, 파일은 파일단위로 새파일을 다운로드 하여 덮어쓰는 방법이 가장 현실적일거 같고,
sqlite db파일같은 경우라면, - 굳이 네트워크 트래픽을 최소한으로 줄이려고 한다면 - 일정 시점 이후 변경된 내용에 대한 sql구문을 추출하여, 그것을 적용하는 방법이 좋을거 같습니다.
그리고, 제 지식이 짧아서 김정균님이 쓰신 글을 절반도 이해를 못하겠지만...(fork라든지 overhead라든지.. ㅋㅋ)
"수백만~수천만개의 프로세스가 생성"되는건 제가 생각한 상황은 아닌거 같습니다...
저는, 하루에 한번 db의 변경된 내용을 "패치, 또는 sql구문으로" 추출해놓고, 수백~수천만의 다수의 클라이언트가 그저 다운로드하는것만 생각했었습니다...
여기서 다수의 클라이언트의 다운로드 트래픽을 최소화하는 방법을 생각해본것이었습니다..
(그러니까... 만약 diff를 사용한다하면, 해당 프로세스는 하루에 1회 실행될뿐인거죠..)
제가 전문지식이 없어서.. 설명을 잘못하겠으니.. 양해바랍니다.. ㅠㅠ
다시한번 조언 고맙습니다.
댓글 달기