我有大约4,000个大小完全不同的文件,我正在尝试尽可能合理地进行高效备份。我知道将它们全部压缩到一个巨大的tarball中并平均分割是一个解决方案,但是当我使用Bluray光盘时,如果刮擦一个部分,则可能会丢失整个光盘的内容。
我编写了一个python脚本,将所有文件(及其大小)放入一个数组中。我首先获取最大的文件,然后添加下一个最大的文件(如果总大小仍小于25GB),或者向下移动列表,直到可以添加一个文件为止,直到达到大小限制,然后重新开始下一个最大的剩余文件。
这工作得相当好,但是最后它确实很参差不齐,我最终将使用比理论上数学上需要的多15张光盘。
有人知道我有更好的方法吗? (这似乎是Google编码面试问题大声笑)。我并不需要它是完美的,我只是想确保在经历这种巨大的非廉价BD-R堆栈之前,我不会愚蠢地这样做。我已包含代码以供参考。
#!/usr/bin/env python3
import os
import sys
# Max size per disc
pmax = 25000000000
# Walk dir
walkdir = os.path.realpath(sys.argv[1])
flist = []
for root, directories, filenames in os.walk( walkdir ):
for filename in filenames:
f = os.path.join(root,filename)
fsize = os.path.getsize(f)
flist.append((fsize,f))
flist.sort()
flist.reverse()
running_total = 0
running_list = []
groups = []
while flist :
for pair in flist :
if running_total + pair[0] < pmax :
running_list.append(pair[1])
running_total = running_total + pair[0]
flist.remove(pair)
groups.append(l)
running_list = []
running_total = 0
print('This will take {} discs.'.format(len(groups)))
我有大约4,000个大小完全不同的文件,我正在尝试尽可能合理地进行高效备份。我知道将它们全部压缩成一个巨大的tarball并平均分配是一个...
我只是蛮力地通过在列表中向下拖动,添加越来越小的文件,直到我用完文件或磁盘已满,然后重复。所谓“数学上需要”,我指的是所有文件的大小/ 25GB =理想的光盘数量。我可以将结果数组发布到