在大型文本数据库中快速子字符串搜索?

时间:2019-02-17 10:27:49

标签: python pandas elasticsearch bigdata

我有一盒磁盘驱动器,其中包含多年工作和个人文件的备份。大多数文件和目录都是其他磁盘甚至是同一磁盘上其他备份的副本。

为了解决这个问题,我创建了一个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)类型的问题。

我了解我目前的算法是幼稚的,可以提出一个更好的算法,但是在这里花时间之前,我想了解一下另一种方法是否更有价值:

  • 我应该在这里使用SQL数据库吗?想一想 与SELECT cksum, len, path FROM files,directories WHERE leftstr(files.path,n) == directories.path;类似。但是也许这句话 和它的python一样贵吗?
  • 其他数据库或工具更适合这种文本搜索吗?我当时在考虑Apache Lucene,ElasticSearch,MongoDB,NOSQL,但是我没有这些经验来决定尝试哪种产品。
  • 也许其他人已经解决了重复数据删除问题?我发现一个 商业PC软件产品很少,但是我不确定它们是否可以处理1000万个文件。

请告知。

0 个答案:

没有答案