我有一盒磁盘驱动器,其中包含多年工作和个人文件的备份。大多数文件和目录都是其他磁盘甚至是同一磁盘上其他备份的副本。
为了解决这个问题,我创建了一个csv文件,其中包含每个文件的校验和,大小和完整路径。然后,我使用pandas库编写了一个简单的Python程序,以计算每个目录的校验和和大小,即目录中包含的所有文件的校验和和大小的总和。这个想法是找到所有具有相同内容的目录,然后删除除一个目录之外的所有目录。
不幸的是(但是我之前曾想过),即使对于我的测试数据集(大约有100万行),代码也要运行几个小时。实际的数据集大约有1000万行。
这是python代码片段:
# for all directories, compute their checksum and total content size
df = pd.DataFrame(columns=['cksum', 'len', 'path'])
i = 0
for path in directories:
# create new dataframe having all files in this directory
items = data[data['path'].str.startswith(path)]
# sum all checksums
cksum = pd.to_numeric(items['cksum']).sum()
# sum all file sizes
len = pd.to_numeric(items['len']).sum()
# store result
df.loc[i] = [cksum, len, path]
i += 1
显然,问题在于,对于每个目录,我必须查找包含的目录和文件,并识别它们,然后执行startswith(path)字符串比较,这比较慢,我需要运行此1(或10)百万每个目录的时间。所以我们这里有O(n ^ 2)类型的问题。
我了解我目前的算法是幼稚的,可以提出一个更好的算法,但是在这里花时间之前,我想了解一下另一种方法是否更有价值:
SELECT cksum, len, path FROM files,directories WHERE leftstr(files.path,n) == directories.path;
类似。但是也许这句话
和它的python一样贵吗? 请告知。