1

私は現在、バックアップ ソリューションに取り組んでいます。ファイルが同期されたら、ファイル/ディレクトリのリスト (アクセス許可/uid/gid) のリストも作成して、どこかに保存したいと思います。

現在、4105 個のファイルと 574 個のディレクトリを持つバックアップ「スナップショット」があります。Python を使用してバックアップ スナップショットを調べてこの情報を取得していますが、これは非常にうまく機能しますが、ここに問題があります。

最初に、すべての情報を取得して 1 つのファイルに書き込もうとしましたが、最終的には 170 MB のサイズになりました。あまり良くない。

次に、ディレクトリごとに情報を分割して書き留めることにしました。最終的に、合計 106MB のディスク使用量になりました。

スクリプト os.walks() はディレクトリ情報を 1 つのリストに保存し、ファイルに対しても同じことを行います。2 つのリストが 1 つのディクショナリに結合され、JSON でエンコードされ、サイズに応じて小さなファイルでディスクに書き込まれます。

ディスク使用量を削減する方法をお勧めしますか?

この情報が書き留められるストレージ エンジンとして SQLite を試したことはありません。また、MySQL を使用した場合、おそらく数 GB のデータベース サイズになる可能性があります。

あなたの推奨事項と支援に感謝します。コードは、私が使用しているものを感じるためのものです。

これは、私が使用しているスクリプトです。

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
4

1 に答える 1

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%に圧縮されることがわかりました。

于 2012-10-02T06:51:18.460 に答える