我正在开发一个备份解决方案,一旦文件被同步,我还想制作一个文件/目录列表(他们的权限/ uid / gid)列表并将其保存在某个地方。
目前我有一个包含4105个文件和574个目录的备份“快照”,我正在使用python来浏览备份快照并获取此信息并且它运行良好,但这里有一个问题。
首先,我想获取所有信息并将其写入单个文件,最后它的大小为170MB。不太好。
然后我决定拆分每个目录的信息并将其写下来,最终总共有106MB的磁盘使用量。
脚本os.walks()并将目录信息保存在一个列表中,然后它对文件执行相同的操作。两个列表组合在一个字典中,然后进行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
答案 0 :(得分: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%。