2012-10-02 5 views
1

파일 동기화가 끝나면 백업 솔루션을 만들고 있습니다. 파일/디렉토리 (권한/uid/gid) 목록을 만들고 어딘가에 저장하고 싶습니다.파일 정보 저장

현재 4105 개의 파일과 574 개의 디렉토리가있는 백업 "스냅 샷"이 있습니다. 파이썬을 사용하여 백업 스냅 샷을 처리하고이 정보를 가져 오지만 아주 잘 작동하지만 여기서는 잡을 수 있습니다.

처음에는 모든 정보를 얻고 단일 파일에 쓰고 싶었습니다. 결국 170MB 크기였습니다. 별로 좋지 않습니다.

그런 다음 디렉토리별로 정보를 분할하여 기록하기로 결정하여 총 106MB의 디스크 사용량을 기록했습니다.

os.walks() 스크립트는 디렉토리 정보를 하나의 목록에 저장 한 다음 파일에 대해 동일한 작업을 수행합니다. 두 개의 목록이 하나의 사전에 결합 된 다음 JSON 인코딩되고 크기에 따라 작은 파일로 디스크에 기록됩니다.

디스크 사용량을 줄이는 방법에 대한 권장 사항이 있는지 궁금합니다.

SQLite를 스토리지 엔진으로 사용하려고 시도하지 않았습니다.이 정보가 기록되거나 MySQL과 함께 저장되면 데이터베이스 크기가 거의 안 될 것입니다.

귀하의 조언과 도움에 감사드립니다. 코드는 제가 사용하고있는 것을 느끼기위한 것입니다.

내가 그 일을 수행 사용하고 스크립트입니다 :

import os, sys 
import json 

zdir = {} 
filestat=[] 
dirstat=[] 
for path, dirs, files in os.walk("/backup/us-s01", followlinks=None): 
     try: 
       # Store files in the directory 
       for file in files: 
         #print os.path.join(path, file) 
         st = os.stat(os.path.join(path, file)) 
         file_stat = { 
                 'name': file, 
                 'perm': oct(st.st_mode)[-4::], 
                 'uid': st.st_uid, 
                 'gid': st.st_gid, 
                 'size': st.st_size 
                 } 
         filestat.append(file_stat) 

       # Store directory in 
       for di in dirs: 
         std = os.stat(os.path.join(path, di)) 
         di_stat = { 
               'name': di, 
               'perm': oct(std.st_mode)[-4::], 
               'uid': std.st_uid, 
               'gid': std.st_gid, 
               'size': std.st_size 
             } 
         dirstat.append(di_stat ) 
       pa = path.replace('/', '-') 
       zdir = { 'files':filestat, 'dirs':dirstat} 
       f = open('/root/test/json'+pa+'dat', 'w') 
       f.write(json.dumps(zdir, separators=(',',':'))) 
       f.close() 

     except OSError: 
       pass 

답변

1
당신은 출력을 위해 gunzip을 사용할 수 있습니다

:

import gzip 

# your code as posted 

zdir = { 'files':filestat, 'dirs':dirstat} 
string_out = json.dumps(zdir, separators=(',',':'))  
f = gzip.open('/root/test/json'+pa+'gz', 'wb') 
f.write(string_out) 

나는이와 함께 테스트를 만들어 발견했습니다 문자열을 텍스트 파일에 쓰는 것과 비교하여 디스크 출력의 10 %로 출력을 압축합니다.

+0

아 그래, gzip 출력을 * SQL BLOB 필드에 저장하는 경우에도 동일하게 적용될 수 있습니다. – Tabiko