我有一个非常大的文件文件夹,我想创建一个包含文件名、路径和格式的数据库以便于访问。
首先,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()
这次我已经完成了我需要做的事情,但我的问题仍然存在。
如何进一步提高效率?