0

我有一个非常大的文件文件夹,我想创建一个包含文件名、路径和格式的数据库以便于访问。

首先,TinyDB 是否适合该数据库?我真的很想保持小规模和本地化。速度并不重要,但会很好......显然。它将包含大约 500,000 行。

其次,我找不到任何关于完成这项任务的有效方法的好信息。我已经搜索过,但结果要么是针对 python 2 的,要么是对我发现的结果的评论似乎无法找到其他更有效的做事方式,但它们没有详细说明。顶级文件夹包含许多文件夹,每个文件夹包含多个文件,因此在此用例中的效率将是理想的。

我可以编写所有代码,但鉴于任务的大小,我只是不确定如何进行搜索部分。

这是我到目前为止所拥有的:

import os
from tinydb import TinyDB, Query
from tinydb.storages import JSONStorage
from tinydb.middlewares import CachingMiddleware
import time

db = TinyDB('db.json', storage=CachingMiddleware(JSONStorage))

start = time.time()

for path, currentDirectory, files in os.walk("test-folder"):
    for file in files:
        db.insert({'path': os.path.join(path, file), 'name': file, 'type': 'txt'})

db.close()

end = time.time()
print("parsed " + str(len(db)) + " files in " + str((end - start) * 1000) + "ms")
# parsed 2452 files in 2846.367120742798ms
# 400kb db

此代码适用于较小的数据库(几千行),但速度很快。

我最终得到了这段代码,这似乎只是工作。我不知道它如何处理比我的完整数据集更大的文件夹结构,但它似乎不占用太多 RAM 并且工作相对较快(对于完整数据集,它平均每个文件大约 1.3 毫秒):

import sqlite3
import time
import os

start = time.time()

con = sqlite3.connect('my-db.db')

cur = con.cursor()

# Create table
cur.execute('DROP TABLE files')
cur.execute('''CREATE TABLE files
               (filename, file path, format)''')


for path, currentDirectory, files in os.walk("my-folder"):
    for file in files:
        #db.insert({'path': os.path.join(path, file), 'name': file, 'type': 'txt'})
        cur.execute("INSERT INTO files VALUES (?, ?, ?)", (file, os.path.join(path, file), 'txt'))
        

con.commit()
end = time.time()
cur = con.execute('select * from files;')
print("parsed " + str(len(cur.fetchall())) + " files in " + str((end - start) * 1000) + "ms")
# parsed 72817 files in 82751.31034851074ms
# size 8116 KB

con.close()

这次我已经完成了我需要做的事情,但我的问题仍然存在。

如何进一步提高效率?

4

0 回答 0